требуется предложение, связанное с переписыванием и манипулированием строк - PullRequest
0 голосов
/ 17 декабря 2009

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

Когда я пытаюсь переписать, его переписать в конце исходного файла.

filesrc = open('c:/FILE/split_doc.txt','r+')
for list in filesrc.readlines():
    #split the records by the delimiter
    fields = list.split(',')
    list = ",".join([s.strip() for s in fields])
    filesrc.writelines(list+"\n")

filesrc.close()

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

Модифицированная программа

filesrc = open('c:/ODI_FILE/split_doc.txt','r+')
lines=0
for list in filesrc.readlines():
    #split the records by the delimiter
        fields = list.split(',')
    list = ",".join([s.strip() for s in fields])
    filesrc.seek(lines)
    filesrc.writelines(list+"\n")
    lines += len(list+"\n")

filesrc.close()

Пожалуйста, помогите мне с правильной логикой.

Правильный исходный файл с лишними пробелами

52       ,William   ,Kudo       ,28/03/199300:00:00
11,Andrew,      Andersen,22/02/199900:00:00
12,John        ,Galagers,20/04/200000:00:00
13,Jeffrey        ,Jeferson,10/06/198800:00:00
20,Jennie,Daumesnil,28/02/198800:00:00
21,Steve,Barrot,24/09/199200:00:00
22,Mary,Carlin,14/03/199500:00:00
30,Paul,Moore,11/03/199900:00:00

Это мой неправильный вывод

52,William,Kudo,28/03/199300:00:00
11,Andrew,Andersen,22/02/199900:00:00
12,John,Galagers,20/04/200000:00:00
13,Jeffrey,Jeferson,10/06/198800:00:00
20,Jennie,Daumesnil,28/02/198800:00:00
21,Steve,Barrot,24/09/199200:00:00
22,Mary,Carlin,14/03/199500:00:00
30,Paul,Moore,11/03/199900:00:00
9500:00:00
30,Paul,Moore,11/03/199900:00:00

здесь последние две строки не должны были прийти

Пожалуйста, предложите требуемый и более быстрый способ, так как это пример файла, и мне нужно, чтобы эта программа работала для миллионов строк.

Есть ли способ заставить эту логику работать с циклом while?

Ответы [ 3 ]

1 голос
/ 17 декабря 2009

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

Вот простой и простой процесс, которому вы должны следовать:

  • прочитать весь файл в строку, затем закрыть файл
  • разбить строку на новых строках на список
  • обработка каждой строки для удаления лишних пробелов
  • воссоединить список в строку
  • перезаписать исходный файл новыми очищенными данными

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

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

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

Кроме того, вы также можете сделать это с помощью цикла while. Для этого вам нужно прочитать документы Python в форме цикла while и провести несколько экспериментов. То, как вы напишите этот цикл, будет зависеть от того, как вы загрузили файл: все сразу в строку, а затем разбить на список или построчно прямо из файла. В любом случае, как вы узнаете, какую работу должен выполнить цикл while, как вы перейдете от одного к другому и как вы узнаете, когда он будет выполнен? Если вы можете ответить на них, вы можете написать свой цикл.

0 голосов
/ 17 декабря 2009

Это не отвечает на ваш вопрос, но вы не думали делать это с Jython?

Пробовал с Сед ?

0 голосов
/ 17 декабря 2009

Вы перезаписываете на ходу, но ваши окончательные результаты короче оригинала, поэтому вы получаете последние X символов оригинального кровотечения, где X - это разница в размере от оригинала до новой версии. Дополнительные вызовы .seek () и truncate () в этой версии будут искать конец вашего нового вывода и отрезать остальную часть файла.

filesrc = open('c:/ODI_FILE/split_doc.txt','r+')
lines=0
for list in filesrc.readlines():
    #split the records by the delimiter
        fields = list.split(',')
    list = ",".join([s.strip() for s in fields])
    filesrc.seek(lines)
    filesrc.writelines(list+"\n")
    lines += len(list+"\n")
filesrc.seek(lines)
filesrc.truncate()
filesrc.close()
...