我最近收到了99个管道分隔的txt文件的一些数据项,但是在其中一些并且使用dataaddress.txt作为示例,其中地址中有返回,例如
14 MakeUp Road
赫尔
HU99 9HU它突然出现在3行而不是1行,因此在此地址之前和之后的数据被管道分开。这似乎是这个地址问题导致我在使用SSIS修正txt文件时出现问题。
我没有回到源代码,我想知道是否有一种方法可以操作txt文件来删除这些回车,而不会影响行结束返回(如果有意义的话)。
答案 0 :(得分:1)
我会使用sed
或awk
。我将向您展示如何使用awk
执行此操作,因为它更加独立于平台。如果您没有awk
,则可以从http://invisible-island.net/mawk/mawk.html下载mawk二进制文件。
这个想法如下 - 告诉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
答案 1 :(得分: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'
说明:
sed将循环执行步骤1到3,直到它到达最后一行,让所有行都适合模式空间,其中sed将替换所有\ n个字符