如何删除txt文件中的回车

时间:2017-01-04 16:55:53

标签: ssis carriage-return delimited-text

我最近收到了99个管道分隔的txt文件的一些数据项,但是在其中一些并且使用dataaddress.txt作为示例,其中地址中有返回,例如

14 MakeUp Road

赫尔

HU99 9HU

它突然出现在3行而不是1行,因此在此地址之前和之后的数据被管道分开。这似乎是这个地址问题导致我在使用SSIS修正txt文件时出现问题。

我没有回到源代码,我想知道是否有一种方法可以操作txt文件来删除这些回车,而不会影响行结束返回(如果有意义的话)。

2 个答案:

答案 0 :(得分:1)

我会使用sedawk。我将向您展示如何使用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'

说明:

  1. 创建标签'a'
  2. N 将下一行附加到模式空间
  3. $!如果不是最后一行,则ba分支(转到)标签'a'
  4. s 替换命令,\ n表示新行,\ r表示回车符,[\ n \ r] + - 按序列匹配新行或回车次数(至少一个,/ g全局匹配(尽可能多次)
  5. sed将循环执行步骤1到3,直到它到达最后一行,让所有行都适合模式空间,其中sed将替换所有\ n个字符