Как объединить два текстовых файла вокруг общего значения в python

#python #python-3.x

#python #python-3.x

Вопрос:

У меня есть два разных файла.

Мне нужно объединить их в один файл. Существует общее значение. Два файла имеют этот формат. Совпадения не будут последовательными. Набор данных 1 line1 может не совпадать с набором данных 2 line1. Более вероятно, что dataset1 line1 будет соответствовать dataset2 line16 или строке 45.

Жирным шрифтом выделены совпадающие значения. Любая направленная помощь будет оценена.

BEEC, BE-EC,,154.7,46.07,,31.63,54.6,4833.6,5.06
BPLZ, BE-LZ,,390.6,62.62,,49.0,145.0,27.3,61.52
BFLP, BF-OP,,180.1,34.89,,40.0,58.26,8533.8,7.31


MRM1234-BEEC-1635753E001 25.6 70.29
MRM1234-BPLZ-1814737E003 8.12 18.13
MRM1234-BFLP-2470883E001 12.92 18.8

Я знаю, как использовать a line.split для получения массива каждого элемента.

Я знаю, как подсчитать в первом столбце L[6:4] второго набора данных, чтобы получить соответствующее значение из 4 букв.

Я попробовал несколько предложенных способов, но безуспешно.

Как мне объединить все столбцы в одну строку, объединенную уникальным 4-значным идентификатором? Сопоставление уникального значения и последующая запись в одну строку ускользают от меня.

Комментарии:

1. Не могли бы вы привести пример объединенной строки.

2. BFLP, BF-OP,,180.1,34.89,,40.0,58.26,8533.8,7.31,12.92,18.8 — Я понимаю, что мне нужен словарь, но не могу заставить его работать. Если вы посмотрите, вы увидите, что конечный результат — это два числовых значения из второго набора данных, сопоставленных с первым набором и просто добавленных в виде csv

Ответ №1:

Содержимое файла dat1 :

 BEEC,BE-EC,,154.7,46.07,,31.63,54.6,4833.6,5.06
BPLZ,BE-LZ,,390.6,62.62,,49.0,145.0,27.3,61.52
BFLP,BF-OP,,180.1,34.89,,40.0,58.26,8533.8,7.31
  

Содержимое файла dat2 :

 MRM1234-BEEC-1635753E001     25.6    70.29
MRM1234-BPLZ-1814737E003     8.12    18.13
MRM1234-BFLP-2470883E001     12.92   18.8
  

Используйте этот быстрый и грязный скрипт для объединения строк обоих файлов, как описано.

 dat1 = {}
with open('dat1') as f:
    for line in f.readlines():
        dat1[line.split(',')[0]] = line.strip().split(',')[1:]

dat2 = {}
with open('dat2') as f:
    for line in f.readlines():
        key = line.strip().split()[0].split('-')[1]
        dat2[key] = line.strip().split()[1:]

for key in dat1.keys():
    print("%s,%s,%s" % (key, str.join(',', dat1[key]), str.join(',', dat2[key])))
  

Это приведет к следующему результату.

 BFLP,BF-OP,,180.1,34.89,,40.0,58.26,8533.8,7.31,12.92,18.8
BEEC,BE-EC,,154.7,46.07,,31.63,54.6,4833.6,5.06,25.6,70.29
BPLZ,BE-LZ,,390.6,62.62,,49.0,145.0,27.3,61.52,8.12,18.13
  

Комментарии:

1. Я получаю ошибку ключа «. Чтобы попытаться упростить, я переделал свою работу, поэтому SiteCode является первым полем в обоих файлах. Я изменил ваш скрипт, чтобы исключить работу .split(‘-‘) и повторно использовал раздел dat1 для dat2 (с изменениями имени). Это все еще выдает мне ошибку. Я распечатал dat1 и dat1, и в них много данных. Я еще не до конца понимаю это, но работаю над этим. Я проверил, что файлы не имеют пустых значений.

2. Ваше решение работает. В моих файлах данных (отправленных мне поставщиками по электронной почте) используется несколько повторяющихся идентификаторов. Спасибо. Помог моему программированию и сразу показал мне ошибку поставщика.

3. Хммм, одна деталь. Если у dat1 есть код сайта, который не существует, он завершается с ошибкой. Это редко, но возможно. Мне нужно будет проверить это.

Ответ №2:

Извините за беспорядок…

 def parse(d1, d2):
    d1 = d1.split('n')
    data1 = [x.split(',') for x in d1 if x]
    d2 = d2.split('n')
    data2 = [x.split(' ') for x in d2 if x]
    target = []
    for x in data2:
        d = [y for y in x if y]
        dd = d[0].split('-')
        dd.extend(d[1:])
        target.append(dd)
    ret = []
    while data1:
        x = data1.pop()
        for y in target:
            if x[0] == y[1]:
                z = x
                z.extend(y[-2:])
                ret.append(z)
    for x in ret:
        print(x)


parse(data1, data2)
  

Где data1, data2 — содержимое файлов