как удалить возврат каретки в текстовом файле

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

14 Дорога макияжа

Корпус

HU99 9HU

Он выходит на 3 строки, а не на одну, содержит данные до и после этого адреса, разделенные вертикальной чертой. Просто кажется, что эта проблема решает проблему, которая вызывает у меня проблемы с загрузкой txt-файла, исправляющего с помощью SSIS.

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


person Simon    schedule 04.01.2017    source источник


Ответы (2)


Я бы использовал sed или awk. Я покажу вам, как это сделать с awk, потому что он более независим от платформы. Если у вас нет awk, вы можете загрузить двоичный файл mawk с http://invisible-island.net/mawk/mawk.html.

Идея заключается в следующем - скажите awk, что у вас другой разделитель строк, а не возврат каретки или перевод строки. Я буду использовать запятую.

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

Вот тестовый файл, который я создал. Сохраните его как test.txt:

1,Line before ...
2,Broken line ... 14 MakeUp Road

Hull

HU99 9HU
3,Line after

И вызовите awk следующим образом:

    awk 'BEGIN { RS = ","; ORS=""; s=""; } $0 != "" {  gsub(/MakeUp Road[\n\r]+Hull[\n\r]+HU99 9HU/, "MakeUp Road Hull HU99 9HU"); print s $0; s="," }' test.txt

Я предлагаю вам сохранить код awk в файл с именем cleanup.awk. Вот лучше отформатированный код с пояснениями.

BEGIN {
  # This block is executed at the beginning of the file
  RS = ","; # Tell awk our records are separated by comma
  ORS="";   # Tell awk not to use record separator in the output
  s="";     # We will print this as record separator in the output
}

{
 # This block is executed for each line.
 # Remember, our "lines" are separated by commas.

 # For each line, use a regular expression to replace the bad text.
 gsub(/MakeUp Road[\n\r]+Hull[\n\r]+HU99 9HU/, "MakeUp Road Hull HU99 9HU"); 

 # Print the replaced text - $0 variable represents the line text.
 print s $0; s=","
}

Используя файл awk, вы можете выполнить замену следующим образом:

awk -f cleanup.awk test.txt

Для обработки нескольких файлов вы можете создать сценарий bash:

for f in `ls *.txt`; do
    # Execute the cleanup.awk program for each file.
    # Save the cleaned output to a file in a directory ../clean
    awk -f cleanup.awk $f > ../clean/$f
done
person Ivan Georgiev    schedule 04.01.2017

Вы можете использовать sed для удаления символов перевода строки и возврата каретки:

sed ':a;N;$!ba;s/MakeUp Road[\n\r]\+/MakeUp Road /g' test.txt | sed ':a;N;$!ba;s/Hull[\n\r]\+/Hull /g'

Объяснение:

  1. : a создайте ярлык "a"
  2. N добавить следующую строку в пространство шаблона
  3. $! если не последняя строка, ba ответвление (переход) метка 'a'
  4. s команда замены, \ n представляет новую строку, \ r представляет собой возврат каретки, [\ n \ r] + - соответствует новой строке или возврату каретки в последовательности столько раз, сколько они встречаются (по крайней мере, один ), / g глобальное совпадение (столько раз, сколько возможно)

sed будет перебирать шаги с 1 по 3, пока не достигнет последней строки, чтобы все строки соответствовали пространству шаблонов, где sed заменит все символы \ n

person Ivan Georgiev    schedule 04.01.2017