#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 — содержимое файлов