2017-01-04 2 views
0

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

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

Халл

HU99 9HU

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

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

ответ

1

Я бы использовал 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 

Чтобы обработать несколько файлов, вы можете создать Баш скрипт:

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 
0

Вы можете использовать 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. : а создать ярлык 'а'
  2. N добавьте следующую строку в шаблоне пространства
  3. $!, если не последняя строка, ba branch (go to) label 'a'
  4. s команда подстановки, \ n представляет новую строку, \ r представляет возврат каретки, [\ n \ r] + - соответствует новой строке или возврат каретки в последовательности столько раз, сколько они происходят (по крайней мере один),/g глобальное совпадение (столько раз, сколько может)

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

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