2016-01-10 2 views
0

В настоящее время я работаю над программой, которая помещает каждое слово в текстовый файл в xlsxwriter. Это означает, что я должен разделить линии.Python-Replacing Duplicatte информация в текстовом файле

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

Текст Пример

Dave likes fresh green apples 
Dave likes fresh green peppers 
Dave hates fresh green apples 
Dave hates rotten green apples 
Jane likes fresh green apples 

желаемого результата в xlsxwriter

C1 C2 C3 C4 C5 
R1 Dave likes fresh green apples 
R2 X  X  X  X peppers 
R3 X hates fresh green apples 
R4 X  X rotten green apples 
R5 Jane likes fresh green apples 

Благодаря

ответ

1

вызов принят.

Как о чем-то вроде этого:

test.txt

Dave likes fresh green apples 
Dave likes fresh green peppers 
Dave hates fresh green apples 
Dave hates rotten green apples 
Jane likes fresh green apples 
Dave likes fresh green watermelon 
Jane likes fresh green peppers 

здесь моей первой идеи (что делает его функции и задокументированы от моей должности)

def read_lines_with_duplicate_replace_v1(path,replace_char="X"): 
    """Generator that read the lines in the file contained in path 
     and for each line that start as some previous line replace each 
     part that is similar with replace_char. Yield a list with the result""" 
    #assume that each line has the same number of elements 
    record=dict() 
    with open(path) as file: 
     for line in file: 
      result = line.split() 
      temp = tuple(result) 
      if temp[0] in record: 
       key = result[0] 
       result[0] = replace_char 
       for i in range(1,len(result)): 
        if result[i] == record[key][i-1]: 
         result[i] = replace_char 
        else: 
         break 
      record[temp[0]] = temp[1:] 
      yield result 

здесь вторая идея, помня только о предыдущей строке

def read_lines_with_duplicate_replace_v2(path,replace_char="X"): 
    """Generator that read the lines in the file contained in path 
     and for each line that start as the previous line replace each 
     part that is similar with replace_char. Yield a list with the result """ 
    #assume that each line has the same number of elements 
    num_elem = 0 
    previous_line = list() 
    with open(path) as file: 
     for line in file: 
      result = line.split() 
      if previous_line: 
       for i in range(num_elem): 
        if result[i] == previous_line[i]: 
         result[i] = replace_char 
        else: 
         break 
       previous_line[i:] = result[i:] 
      else: 
       previous_line.extend(result) 
       num_elem = len(previous_line) 
      yield result 

выход:

>>> for x in read_lines_with_duplicate_replace_v1("test.txt"): 
     print(*x) 


Dave likes fresh green apples 
X X X X peppers 
X hates fresh green apples 
X X rotten green apples 
Jane likes fresh green apples 
X likes fresh green watermelon 
X X X X peppers 
>>> 
>>> 
>>> for x in read_lines_with_duplicate_replace_v2("test.txt"): 
     print(*x) 


Dave likes fresh green apples 
X X X X peppers 
X hates fresh green apples 
X X rotten green apples 
Jane likes fresh green apples 
Dave likes fresh green watermelon 
Jane likes fresh green peppers 
>>> 
+0

Вы красивый человек, и я люблю тебя за это. Я должен был внести несколько корректировок, но он работает хорошо. Мне пришлось изменить строку «для строки в test.splitlines():». Сначала я вложил текстовый файл в список и использовал список в цикле for без «разделенных линий», иначе я получил ошибку. При использовании списка переменная temp = line.split() видит достаточно. –

+0

Я использую test.splitlines(), потому что я делаю все из IDLE без чтения файла, но это эквивалентно 'test = open (" test.txt "). Read()', в вашем случае вы можете делать 'с open ("test.txt") в качестве теста: '' record = dict() '' для строки в тесте: 'и остальное то же самое. Во второй раз, когда я использую 'temp = line.split()', нужно обновить запись последней строкой, как она есть, в случае, если это было изменение X на предыдущем шаге, не сохраняйте это. Теперь, когда я думаю об этом, dict тоже не нужен, хорошо, если вы интересны только в предыдущей строке, в этом случае достаточно списка – Copperfield

+0

Когда я прокомментировал запись [temp [0]] = temp [1:] программа не работала должным образом. Так как это прямо сейчас, dict кажется необходимым –

 Смежные вопросы

  • Нет связанных вопросов^_^