【发布时间】:2016-10-29 18:21:33
【问题描述】:
简介:
我收到了一个 CSV 文件,其中字段分隔符是管道字符(即|)。
该文件具有预定义数量的字段(例如N)。我可以通过读取 CSV 文件的标题来发现 N 的值,我们可以假设它是正确的。
问题:
某些字段错误地包含换行符,这使该行看起来比要求的短(即,它具有M 字段,带有M < N)。
我需要创建一个sh 脚本(不是bash)来修复这些行。
尝试的解决方案:
我尝试创建以下脚本来尝试修复文件:
if [ $# -ne 1 ]
then
echo "Usage: $0 <filename>"
exit
fi
# get first line
first_line=$(head -n 1 $1)
# get number of fields
num_separators=$(echo "$first_line" | tr -d -c '|' | awk '{print length}')
cat $1 | awk -v numFields=$(( num_separators + 1 )) -F '|' '
{
totRecords = NF/numFields
# loop over lines
for (record=0; record < totRecords; record++) {
output = ""
# loop over fields
for (i=0; i<numFields; i++) {
j = (numFields*record)+i+1
# replace newline with question mark
sub("\n", "?", $j)
output = output (i > 0 ? "|" : "") $j
}
print output
}
}
'
但是,换行符仍然存在。 我该如何解决这个问题?
CSV 示例:
FIRST_NAME|LAST_NAME|NOTES
John|Smith|This is a field with a
newline
Foo|Bar|Baz
预期输出:
FIRST_NAME|LAST_NAME|NOTES
John|Smith|This is a field with a * newline
Foo|Bar|Baz
* I don't care about the replacement, it could be a space, a question mark, whatever except a newline or a pipe (which would create a new field)
【问题讨论】:
-
您能否包含示例输入和预期输出?
-
是否可以假设如果一个字段包含换行符,那么该记录将包含更少的字段然后标题以及下一条记录将包含更少的字段?
-
@anubhava 是的,我会尽快包含它
-
W.r.t.示例输入,没有更多信息,我认为无论如何都不知道额外的换行符是在第一条记录的最后一个字段中,还是在第二条记录的第一个字段中。当然,作为人类,我们可以看到您的意思是它位于第一条记录的最后一个字段中,但是程序怎么知道呢?
-
@jas 很好的观察,我忘了提。据我所知(我不是此类文件的制作者),第一个字段不应该由人输入(它有其他输入字段并且可以错误地插入换行符),但它是一种ID,所以我们可以安全地假设第一个字段不包含任何奇怪的字符。在这种情况下,错误必须存在于最后一个字段中。