Проблема пропуска строки во время итерации с использованием сравнения предыдущей строки и текущей строки - PullRequest
0 голосов
/ 17 февраля 2020

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

Последний шаг сценария проверяет содержимое каждого поля и, если все, кроме последнее совпадение полей, затем оно скопирует последнее поле текущей строки в последнее поле предыдущей строки.

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

Вот пример набора данных

field1,field2,field3,field4,something
field1,field2,field3,field4,else

Желаемый вывод

field1,field2,field3,field4,something else

Это то, что у меня есть до сих пор

output_csv = ['field1,field2,field3,field4,something',
              'field1,field2,field3,field4,else']

# run through the output
# open and create a csv file to save output
with open('output_table.csv', 'w') as f:

    previous_line = None
    part_duplicate_line = None
    part_duplicate_flag = False

    for line in output_csv:
        part_duplicate_flag = False

        if previous_line is not None:                    
            previous = previous_line.split(',')
            current = line.split(',')

            if (previous[0] == current[0] 
                and previous[1] == current[1]
                and previous[2] == current[2]
                and previous[3] == current[3]):
                print(previous[0], current[0])
                previous[4] = previous[4].replace('\n', '') + ' ' + current[4]
                part_duplicate_line = ','.join(previous)
                part_duplicate_flag = True
                f.write(part_duplicate_line)

            if part_duplicate_flag is False:
                f.write(previous_line)

        previous_line = line

Сценарий ATM добавляет строку, но не пропускает следующую строку, я пробовал различные варианты операторов continue после записи part_duplicate_line в файл, но безрезультатно.

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Я предлагаю инкапсулировать то, что вы хотите сделать, в функцию, где важная часть подчиняется этому логике c:

либо присоединиться к new информация к записи old
или выводит запись old и забывает ее

, конечно, в конце l oop мы в любом случае иметь висячую old запись для вывода

def join(inp_fname, out_fname):
    '''Input file contains sorted records, when two (or more) records differ
only in the last field, we join the last fields with a space
and output only once, otherwise output the record as-is.'''
    ######################### Prepare for action ##########################
    from csv import reader, writer
    with open(inp_fname) as finp, open(out_fname, 'w') as fout:
        r, w = reader(finp), writer(fout)
        ######################### Important Part starts here ############## 
        old = next(r)
        for new in r:
            if old[:-1] == new[:-1]:
                old[-1] += ' '+new[-1]
            else:
                w.writerow(old)
                old = new
        w.writerow(old)

Чтобы проверить, что я предложил, вы можете использовать эти два фрагмента (обратите внимание, что эти записи короче, чем у вас, но это пример, и это не имеет значения, потому что мы используем только -1 для индексации наших записей).

1-й имеет «обычную» последнюю запись

open('a0.csv', 'w').write('1,1,2\n1,1,3\n1,2,0\n1,3,1\n1,3,2\n3,3,0\n')
join('a0.csv', 'a1.csv')

, в то время как 2-й имеет последнюю запись, которая должен быть присоединен к предыдущему.

open('b0.csv', 'w').write('1,1,2\n1,1,3\n1,2,0\n1,3,1\n1,3,2\n')
join('b0.csv', 'b1.csv')

Если вы запускаете фрагменты, как я это делал до публикации, в среде, в которой вы определили join, вы должны получить то, что хотите.

1 голос
/ 17 февраля 2020

Похоже, что вы хотите одну запись для каждой комбинации первых 4 полей

. Вы можете использовать dict для агрегирования данных -

#First we extract the key and values
output_csv_keys = list(map(lambda x: ','.join(x.split(',')[:-1]), output_csv)) 
output_csv_values = list(map(lambda x: x.split(',')[-1], output_csv))

#Then we construct a dictionary with these keys and combine the values into a list
from collections import defaultdict
output_csv_dict = defaultdict(list) 
for key, value in zip(output_csv_keys, output_csv_values): 
  output_csv_dict[key].append(value) 

#Then we extract the key/value combinations from this dictionary into a list
for_printing = [','.join([k, ' '.join(v)]) for k, v in output_csv_dict.items()]
print(for_printing)
#Output is ['field1,field2,field3,field4,something else']
#Each entry of this list can be output to the csv file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...