[PC-WIN]Przerabianie pliku tektowego

Wszystko o naszych urządzeniach: PC, laptopy, jednopłytkowce, itp - problemy ze sprzętem , aplikacjami itd.
Awatar użytkownika
WoodPaker
User
User
Posty: 136
Rejestracja: czwartek 17 wrz 2015, 19:23
Lokalizacja: USA
Kontaktowanie:

[PC-WIN]Przerabianie pliku tektowego

Postautor: WoodPaker » wtorek 21 cze 2016, 00:13

Witajcie moi drodzy parafianie
Mam problem, który się nazywa "cholernie mało czasu na wszystko" co spowodowało, że schudłem, zbrzydłem i w ogóle. Ale nie o tym chciałem pisać ;)
Z braku czasu nie za bardzo mam jak zaprogramować program (może być konsola - wsio adno), który przerobi mi plik.
Przykładowy plik wklejam poniżej

Kod: Zaznacz cały


 $GENNBO  NATOMS=17  NBAS=205  UPPER  BODM  $END
 $NBO  $END
 $COORD
 1 + OH radical                                                               
      6     6       2.355789      -0.216790       0.001577
      7     7       1.765898       0.943478       0.009398
      7     7       1.494552      -1.290113      -0.003843
      6     6       0.411338       0.624382       0.009109
      1     1       1.740951      -2.267932      -0.014561
      6     6       0.222262      -0.754246      -0.000729
      6     6      -0.743265       1.479421       0.003108
      7     7      -0.932040      -1.465376       0.007610
      7     7      -1.936185       0.671891      -0.004584
      8     8      -0.846736       2.694706      -0.004329
      6     6      -1.996142      -0.696468      -0.003366
      1     1      -2.786122       1.217416      -0.080533
      7     7      -3.248440      -1.269340      -0.069970
      1     1      -3.998146      -0.793635       0.412929
      1     1      -3.225743      -2.266470       0.094556
      8     8       3.678806      -0.452080      -0.001016
      1     1       4.106108       0.418035       0.001891
 $END
 $BASIS
  CENTER =      1      1      1      1      1      1      1      1      1      1      1      1      1      1      1      2      2
                2      2      2      2      2      2      2      2      2      2      2      2      2      3      3      3      3
                3      3      3      3      3      3      3      3      3      3      3      4      4      4      4      4      4
                4      4      4      4      4      4      4      4      4      5      5      5      5      5      6      6      6
                6      6      6      6      6      6      6      6      6      6      6      6      7      7      7      7      7
                7      7      7      7      7      7      7      7      7      7      8      8      8      8      8      8      8
                8      8      8      8      8      8      8      8      9      9      9      9      9      9      9      9      9
                9      9      9      9      9      9     10     10     10     10     10     10     10     10     10     10     10
               10     10     10     10     11     11     11     11     11     11     11     11     11     11     11     11     11
               11     11     12     12     12     12     12     13     13     13     13     13     13     13     13     13     13
               13     13     13     13     13     14     14     14     14     14     15     15     15     15     15     16     16
               16     16     16     16     16     16     16     16     16     16     16     16     16     17     17     17     17
               17
   LABEL =      1      1    101    102    103      1    101    102    103    201    204    206    202    203    205      1      1
              101    102    103      1    101    102    103    201    204    206    202    203    205      1      1    101    102
              103      1    101    102    103    201    204    206    202    203    205      1      1    101    102    103      1
              101    102    103    201    204    206    202    203    205      1      1    101    102    103      1      1    101
              102    103      1    101    102    103    201    204    206    202    203    205      1      1    101    102    103
                1    101    102    103    201    204    206    202    203    205      1      1    101    102    103      1    101
              102    103    201    204    206    202    203    205      1      1    101    102    103      1    101    102    103
              201    204    206    202    203    205      1      1    101    102    103      1    101    102    103    201    204
              206    202    203    205      1      1    101    102    103      1    101    102    103    201    204    206    202
              203    205      1      1    101    102    103      1      1    101    102    103      1    101    102    103    201
              204    206    202    203    205      1      1    101    102    103      1      1    101    102    103      1      1
              101    102    103      1    101    102    103    201    204    206    202    203    205      1      1    101    102
              103
 $END
 $CONTRACT
  NSHELL =     63
    NEXP =    157
   NCOMP =      1      4      4      6      1      4      4      6      1      4      4      6      1      4      4      6      1
                1      3      1      4      4      6      1      4      4      6      1      4      4      6      1      4      4
                6      1      4      4      6      1      4      4      6      1      1      3      1      4      4      6      1
                1      3      1      1      3      1      4      4      6      1      1      3
   NPRIM =      6      3      1      1      6      3      1      1      6      3      1      1      6      3      1      1      3
                1      1      6      3      1      1      6      3      1      1      6      3      1      1      6      3      1
                1      6      3      1      1      6      3      1      1      3      1      1      6      3      1      1      3
                1      1      3      1      1      6      3      1      1      3      1      1
    NPTR =      1      7     10     11     12     18     21     22     23     29     32     33     34     40     43     44     45
               48     49     50     56     59     60     61     67     70     71     72     78     81     82     83     89     92
               93     94    100    103    104    105    111    114    115    116    119    120    121    127    130    131    132
              135    136    137    140    141    142    148    151    152    153    156    157
     EXP =   0.3047525E+04   0.4573695E+03   0.1039487E+03   0.2921016E+02
             0.9286663E+01   0.3163927E+01   0.7868272E+01   0.1881289E+01
             0.5442493E+00   0.1687145E+00   0.8000000E+00   0.4173511E+04
             0.6274579E+03   0.1429021E+03   0.4023433E+02   0.1282021E+02
             0.4390437E+01   0.1162636E+02   0.2716280E+01   0.7722184E+00
             0.2120315E+00   0.8000000E+00   0.4173511E+04   0.6274579E+03
             0.1429021E+03   0.4023433E+02   0.1282021E+02   0.4390437E+01
             0.1162636E+02   0.2716280E+01   0.7722184E+00   0.2120315E+00
             0.8000000E+00   0.3047525E+04   0.4573695E+03   0.1039487E+03


Nie jest to cały plik. Cały plik znajduje się w tym linku http://wklej.org/id/2602096/
Ogólnie chodzi o to by liczby znajdujące się w sekcji $BASIS $END po słowach CENTER= oraz LABEL= były zapisywane w liczbie 13 liczb w linii , a nie tak jak teraz 17 (czasami jest 19, czasami 15). Mogą być oddzielone pojedynczymi spacjami, nie ma to znaczenia.

Czyli zamiast

Kod: Zaznacz cały

 CENTER =      1    1    1    1    1    1    1    1    1    1    1    1    1    1    1    2    2
                     2    2    2    2    2    2    2    2    2    2    2    2    2    3    3    3    3

winno być

Kod: Zaznacz cały

 CENTER =      1    1    1    1    1    1    1    1    1    1    1    1    1   
                     1    1    2    2     2    2    2   2    2    2    2    2    2
                     2    2    2    2    3    3    3    3         


Proszę, pomóżcie bo się zachlastam na śmierć :/
Life is to short to eject USB safely

Awatar użytkownika
WoodPaker
User
User
Posty: 136
Rejestracja: czwartek 17 wrz 2015, 19:23
Lokalizacja: USA
Kontaktowanie:

Re: [PC-WIN]Przerabianie pliku tektowego

Postautor: WoodPaker » wtorek 21 cze 2016, 00:18

Oczywiście jeden plik można przerobić ręcznie i nie jest to czasochłonne... Ale jak się ma ich 150 :/

Najlepiej byłoby jakby program odczytywał pliki w katalogu, a następnie przerabiał wszystkie pliki z rozszerzeniem *.47 nie zmieniając nazwy pliku, a tylko jego bebechy :)
Life is to short to eject USB safely

Awatar użytkownika
WoodPaker
User
User
Posty: 136
Rejestracja: czwartek 17 wrz 2015, 19:23
Lokalizacja: USA
Kontaktowanie:

Re: [PC-WIN]Przerabianie pliku tektowego

Postautor: WoodPaker » wtorek 21 cze 2016, 00:29

Zgodnie z sugestią Antystatycznego wklejam przykładowy plik poniżej
8-OXOG-1.zip
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Life is to short to eject USB safely

Awatar użytkownika
PROTON
Expert
Expert
Posty: 531
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Re: [PC-WIN]Przerabianie pliku tektowego

Postautor: PROTON » wtorek 21 cze 2016, 00:55

Kod: Zaznacz cały

#!/usr/bin/env python

import os

def fileParser(filename):
    parseNextLine = 0
    buf = []
    f = open(filename, 'r')
    w = open("M_"+filename, 'w')
    while True:
        lines = f.readlines(100)
        if not lines: break
        for l in lines:
            ll=l.strip()
            if ll[:5] == "LABEL":
                parseNextLine = 0
                while buf:
                    w.write(' '.join(buf[:13]) + '\n')
                    del buf[:13]

            if ll[:6] == "CENTER" or parseNextLine:
                parseNextLine = 1
                buf = buf + l.split()
            else:
                w.write(l)



def run():
    for file in os.listdir("./"):
        if file.endswith(".47"):
            fileParser(file)
           
           
if __name__ == '__main__':
    run()



W Pythonie tylko tyle zajęło.
Ostatnio zmieniony wtorek 21 cze 2016, 00:59 przez PROTON, łącznie zmieniany 1 raz.
Gott weiß ich will kein Engel sein.

Awatar użytkownika
WoodPaker
User
User
Posty: 136
Rejestracja: czwartek 17 wrz 2015, 19:23
Lokalizacja: USA
Kontaktowanie:

Re: [PC-WIN]Przerabianie pliku tektowego

Postautor: WoodPaker » wtorek 21 cze 2016, 00:56

Dziękuję Ci bardzo. Zaraz przetestuje!
Life is to short to eject USB safely

Awatar użytkownika
PROTON
Expert
Expert
Posty: 531
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Re: [PC-WIN]Przerabianie pliku tektowego

Postautor: PROTON » wtorek 21 cze 2016, 00:58

Opiszę jak działa, przeszukuje katalog w poszukiwaniu plików *.47, tworzy nowy plik M_<nazwa>.47 i do niego zapisuje poprawione dane.
Gott weiß ich will kein Engel sein.

Awatar użytkownika
PROTON
Expert
Expert
Posty: 531
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Re: [PC-WIN]Przerabianie pliku tektowego

Postautor: PROTON » wtorek 21 cze 2016, 10:59

Program poprawiony, podmienia zawartość plików, sekcję którą chcemy aby podmienił wpisujemy tu:
toParse = [ "CENTER", "LABEL" ]
Sekcja musi się zaczynać od nazwy i kończy się kiedy na początku następnej linii nie ma cyfry albo znaku minus (-)
Domyślnie pierwsza linia sekcji zapisanej do nowego pliku zawiera 15 elementów, "nazwa", "=", <13 cyfr>, kolejne linie zawierają po 13 elementów.

Program jest rozwojowy, możemy utworzyć z niego klasę, ułatwi to kontrolę nad zmiennymi.

Kod: Zaznacz cały

#!/usr/bin/env python

import os
import shutil

def fileParser(filename):
    tempFile = "M_temp.tmp"
    parseNextLine = 0
    #toParse = [ "CENTER", "LABEL", "NCOMP", "NPRIM", "EXP", "CS" ]
    toParse = [ "CENTER", "LABEL" ]
    buf = []
    f = open(filename, 'r')
    w = open(tempFile, 'w')
    while True:
        lines = f.readlines(100)
        if not lines: break
        for l in lines:

            #########################################

            #########################################

            #l =l.rstrip()
            if l:
                ll=l.split()
                if not ll[0][0].isdigit() and not ll[0][0] == '-':
                    if parseNextLine:
                        parseNextLine = 0
                        w.write('\t'.join(buf[:15]) + '\n')
                        del buf[:15]
                        while buf:
                            w.write('\t'.join(buf[:13]) + '\n')
                            del buf[:13]

                if ll[0] in toParse or parseNextLine:
                    parseNextLine = 1
                    buf = buf + ll
                else:
                    w.write(l)

            ########################################

            ########################################


    f.close()
    w.close()
    os.remove(filename)
    shutil.copyfile(tempFile, filename)
    os.remove(tempFile)

def run():
    for file in os.listdir("./"):
        if file.endswith(".47"):
            fileParser(file)


if __name__ == '__main__':
    run()

Gott weiß ich will kein Engel sein.

Awatar użytkownika
PROTON
Expert
Expert
Posty: 531
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Re: [PC-WIN]Przerabianie pliku tektowego

Postautor: PROTON » wtorek 21 cze 2016, 11:00

Program należy odpalić w katalogu gdzie są pliki *.47, on już je wszystkie "przeleci".
Gott weiß ich will kein Engel sein.

Awatar użytkownika
PROTON
Expert
Expert
Posty: 531
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Re: [PC-WIN]Przerabianie pliku tektowego

Postautor: PROTON » wtorek 21 cze 2016, 23:08

KOLEJNA WERSJA, parsuje wszystkie sekcje gdzie występuje znak równości za nazwą sekcji. (=), zamienia tabulatory na 3 spacje.

Kod: Zaznacz cały

#!/usr/bin/env python

import os
import shutil

def fileParser(filename):
    tempFile = "M_temp.tmp"
    parseNextLine = 0
    buf = []
    f = open(filename, 'r')
    w = open(tempFile, 'w')
    while True:
        lines = f.readlines(100)
        if not lines:
            #TODO: write buffer to file.
            #if parseNextLine:
               
            break
        for l in lines:

            #########################################

            #########################################

            #l =l.rstrip()
            if l:
                ll=l.split()
                if not ll[0][0].isdigit() and not ll[0][0] == '-':
                    if parseNextLine:
                        parseNextLine = 0
                        w.write('   '.join(buf[:15]) + '\n')
                        del buf[:15]
                        while buf:
                            w.write('   '.join(buf[:13]) + '\n')
                            del buf[:13]

                if len(ll) > 1 and ll[1] == '=' or parseNextLine:
                    parseNextLine = 1
                    buf = buf + ll
                else:
                    w.write('   '.join(ll) + '\n')

            ########################################

            ########################################


    f.close()
    w.close()
    os.remove(filename)
    shutil.copyfile(tempFile, filename)
    os.remove(tempFile)

def run():
    for file in os.listdir("./"):
        if file.endswith(".47"):
            fileParser(file)


if __name__ == '__main__':
    run()



Gott weiß ich will kein Engel sein.

Awatar użytkownika
WoodPaker
User
User
Posty: 136
Rejestracja: czwartek 17 wrz 2015, 19:23
Lokalizacja: USA
Kontaktowanie:

Re: [PC-WIN]Przerabianie pliku tektowego

Postautor: WoodPaker » środa 22 cze 2016, 01:13

Dziękuje
Działa:)
Niech Ci Bozia w dzieciach wynagrodzi ;)
Life is to short to eject USB safely

Awatar użytkownika
PROTON
Expert
Expert
Posty: 531
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Re: [PC-WIN]Przerabianie pliku tektowego

Postautor: PROTON » środa 22 cze 2016, 21:52

NOWA WERSJA, zrobiona na bazie ver2, zamienia wszystkie odstępy (spacje, tabulatory) na 3 spacje.

Kod: Zaznacz cały

#!/usr/bin/env python

import os
import shutil

def fileParser(filename):
    tempFile = "M_temp.tmp"
    parseNextLine = 0
    #toParse = [ "CENTER", "LABEL", "NCOMP", "NPRIM", "EXP", "CS" ]
    toParse = [ "CENTER", "LABEL" ]
    buf = []
    f = open(filename, 'r')
    w = open(tempFile, 'w')
    while True:
        lines = f.readlines(100)
        if not lines: break
        for l in lines:

            #########################################

            #########################################

            #l =l.rstrip()
            if l:
                ll=l.split()
                if not ll[0][0].isdigit() and not ll[0][0] == '-':
                    if parseNextLine:
                        parseNextLine = 0
                        w.write('   '.join(buf[:15]) + '\n')
                        del buf[:15]
                        while buf:
                            w.write('   '.join(buf[:13]) + '\n')
                            del buf[:13]

                if ll[0] in toParse or parseNextLine:
                    parseNextLine = 1
                    buf = buf + ll
                else:
                    w.write('   '.join(ll) + '\n')

            ########################################

            ########################################


    f.close()
    w.close()
    os.remove(filename)
    shutil.copyfile(tempFile, filename)
    os.remove(tempFile)

def run():
    for file in os.listdir("./"):
        if file.endswith(".47"):
            fileParser(file)


if __name__ == '__main__':
    run()



Gott weiß ich will kein Engel sein.


Wróć do „Sprzęt, sterowniki, oprogramowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości