Перевести данные из 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 шт):
Похоже у вас там фиксированные позиции, посмотрите на метод 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