Python3 как условно объединить 2 текстовых файла построчно - PullRequest
0 голосов
/ 28 мая 2020

У меня есть две таблицы ascii в текстовых файлах, содержащие информацию о звездах, одна из которых с заголовками

| ID | ВРЕМЯ | МАГНИТУДА | ОШИБКА |

, а у другого есть заголовки

| ID | CLASS |

, и я хочу добавить столбец CLASS в первый текстовый файл. Основная проблема здесь заключается в том, что первый текстовый файл имеет много строк для каждой звезды (IE Star 3_6588 имеет 20 записей в таблице a для разного времени), тогда как второй текстовый файл имеет только одну запись для каждого идентификатора (поскольку Star 3_6588 всегда a Class I).

Что мне нужно сделать, так это добавить | CLASS | столбец к первой таблице, где каждый экземпляр специфицированного c ID имеет требуемый класс. В текстовом файле более 14 миллионов строк, поэтому я не могу просто сделать это вручную.

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

@ Терри Споттс прав. Однако начальные и конечные символы | в строке заголовка сделают этот CSV-файл немного сложным, поскольку разделителем является вертикальная черта, но иногда с начальным пробелом, конечным пробелом или и тем и другим. Но вот пример для создания вашего ID: Class словаря:

> cat bigfile.txt
| ID | TIME | MAGNITUDE | ERROR |
| Star 3_6588 | 10 | 2 | 1.02 |
| Star 3_6588 | 15 | 4 | 1.2 |
| Star 2_999 | 20 | 6 | 1.4 |
| Star 2_999 | 25 | 8 | 1.6 |

> cat smallfile.txt
| ID | CLASS |
| Star 3_6588 | CLASS I |

Код:

id2class = {}
with open('/tmp/smallfile.txt', 'r') as classfile:
    line = classfile.readline()        # Skip Header Line
    for line in classfile:
        line = line.rstrip('\n')[2:-2] # strip newline and the Pipe-Space / Space-Pipe and the start + end
        fields = line.split(' | ')     # Split on ' | '
        id = fields[0]
        starclass = fields[1]
        id2class[id] = starclass

Теперь у вас есть dict id2class, который выглядит так:

{
    'Star 3_6588': 'CLASS I',
    'Star 2_999': 'CLASS II'
}

Затем вы можете аналогичным образом проанализировать первый файл, использовать идентификатор каждой строки для поиска Class в dict и записать полные данные для строки в новый файл. Я оставлю эту часть вам :)

Удачного кодирования!

0 голосов
/ 28 мая 2020

Похоже, вам следует использовать модуль csv для чтения файла ID | CLASS в словарь, затем перебирать первый файл построчно, искать CLASS, используя значение ID, и выводить полученная "строка" в новый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...