Перевести данные из txt файла в Excel

Я работаю в программе конечно-элементного моделирования и мне нужно автоматизировать процесс выгрузки данных (файл можно открывать как txt), с последующим их структурированием и получением Excel файла. Ниже примеры подобных файлов (бывает выгружаются немного по разному, лишние пробелы и т.д.), также стоит отметить, что некоторые файлы содержат более 1 000 000 строк.
Я находил простые решения простых задач, но в этой не получится обойтись простым разделителем, здесь если число положительное то оно разделено пробелом, а если отрицательное, то на месте пробела стоит "-" и он является частью этого числа, тем более все числа представлены в экспоненциальной форме (последние два столбца не интересны)

*KEYWORD
*CONTROL_FORMING_MAXID
$     NPID     MXIDN     MXIDE    MXIDH  I2DYNAIN
         0         0         0         0         0
*NODE  
12236424 2.983630816E+01-4.042703176E+01-3.544279204E+01       0       0
12236425 2.983629904E+01-4.092704272E+01-3.544058904E+01       0       0
12236428 2.983640348E+01-4.042918554E+01-3.594280018E+01       0       0
12236429 2.983638822E+01-4.092920473E+01-3.594058796E+01       0       0
*KEYWORD
*CONTROL_FORMING_MAXID
$     NPID     MXIDN     MXIDE    MXIDH  I2DYNAIN
         0         0         0         0         0
*BOUNDARY_SPC_NODE  
    428578         0         1         1         1         1         1         1
    428579         0         1         1         1         1         1         1
    428580         0         1         1         1         1         1         1
    428581         0         1         1         1         1         1         1
    429140         0         1         1         1         1         1         1
    578780         0         1         1         1         1         1         1
    578781         0         1         1         1         1         1         1
*NODE  
  428450-4.938889155E-02 1.417327727E-02-7.995352747E+00       0       0
  428451-4.938006831E-02 5.143947265E-01-7.995257790E+00       0       0
  428452 4.505296270E-01 5.143865897E-01-7.995272233E+00       0       0
  428453 4.505218191E-01 1.416496122E-02-7.995366520E+00       0       0
  428454-4.941766180E-02 1.357687718E-02-8.995286966E+00       0       0
  428455-4.941014003E-02 5.137780139E-01-8.995196019E+00       0       0
  428456 4.505026304E-01 5.137710659E-01-8.995210119E+00       0       0
  428457 4.504959084E-01 1.356971048E-02-8.995300458E+00       0       0
  428458-4.944581670E-02 1.296924219E-02-9.995248631E+00       0       0
  428459-4.943942290E-02 5.131508731E-01-9.995162092E+00       0       0

Для начала меня интересует выгрузка данных по полю *NODE в форме:

Номер X Y Z
428450 -4.938889155E-02 1.417327727E-02 -7.995352747E+00

Чтобы дальше можно было работать уже с структурированными данными в Excel

Я только начинаю изучать методы работы с подобными задачами и нашёл применение pandas для работы с df и регулярные выражения, не прошу дать готовый код, хочу узнать какой инструмент будет эффективен для такой задачи, чтобы начать его изучение.


Ответы (1 шт):

Автор решения: CrazyElf

Похоже у вас там фиксированные позиции, посмотрите на метод read_fwf
Вы же можете сами читать файл, найти нужную часть и подать файловый указатель стоящий на нужном месте на вход этому методу (у меня пример вместо файла StringIO, просто замените работу с ним на чтение вашего файла через open):

import pandas as pd
from io import StringIO

data = StringIO("""
*KEYWORD
*CONTROL_FORMING_MAXID
$     NPID     MXIDN     MXIDE    MXIDH  I2DYNAIN
         0         0         0         0         0
*BOUNDARY_SPC_NODE  
    428578         0         1         1         1         1         1         1
    428579         0         1         1         1         1         1         1
    428580         0         1         1         1         1         1         1
    428581         0         1         1         1         1         1         1
    429140         0         1         1         1         1         1         1
    578780         0         1         1         1         1         1         1
    578781         0         1         1         1         1         1         1
*NODE  
  428450-4.938889155E-02 1.417327727E-02-7.995352747E+00       0       0
  428451-4.938006831E-02 5.143947265E-01-7.995257790E+00       0       0
  428452 4.505296270E-01 5.143865897E-01-7.995272233E+00       0       0
  428453 4.505218191E-01 1.416496122E-02-7.995366520E+00       0       0
  428454-4.941766180E-02 1.357687718E-02-8.995286966E+00       0       0
  428455-4.941014003E-02 5.137780139E-01-8.995196019E+00       0       0
  428456 4.505026304E-01 5.137710659E-01-8.995210119E+00       0       0
  428457 4.504959084E-01 1.356971048E-02-8.995300458E+00       0       0
  428458-4.944581670E-02 1.296924219E-02-9.995248631E+00       0       0
  428459-4.943942290E-02 5.131508731E-01-9.995162092E+00       0       0
  """)

df = None
widths = [8, 16, 16, 16, 8, 8]
with data as f:
    for line in f:
        if '*NODE' in line:
            df = pd.read_fwf(f, widths=widths, header=None)
            break
df

Вывод (не отформатированный нормально - названия колонок съехали):

0   1   2   3   4   5
0   428450  -0.049389   0.014173    -7.995353   0   0
1   428451  -0.049380   0.514395    -7.995258   0   0
2   428452  0.450530    0.514387    -7.995272   0   0
3   428453  0.450522    0.014165    -7.995367   0   0
4   428454  -0.049418   0.013577    -8.995287   0   0
5   428455  -0.049410   0.513778    -8.995196   0   0
6   428456  0.450503    0.513771    -8.995210   0   0
7   428457  0.450496    0.013570    -8.995300   0   0
8   428458  -0.049446   0.012969    -9.995249   0   0
9   428459  -0.049439   0.513151    -9.995162   0   0
→ Ссылка