【问题标题】:Finding a newline in the csv file在 csv 文件中查找换行符
【发布时间】:2018-04-01 17:53:21
【问题描述】:

我知道对此有很多问题(最新的here.),但几乎所有问题都是如何将这些虚线从 csv 文件中合并为一条或删除它们。我不想删除,但我只想显示/查找该行(或者可能是行号?)

示例数据:

22224,across,some,text,0,,,4 etc
33448,more,text,1,,3,,,4 etc
abcde,text,number,444444,0,1,,,, etc
358890,more
,text,here,44,,,, etc
abcdefg,textds3,numberss,413,0,,,,, etc
985678,93838,text,,,,
,text,continuing,from,previous,line,,, etc

对此进行更多搜索,我知道我不应该使用bash 来完成此操作,而应该使用perl。我试过(来自不同的网站,我不知道 perl),但显然我没有 Text::CSV 包,我没有安装的权限。

正如我所说,我什至不知道如何开始寻找这个,所以我没有任何脚本。这是not 一个windows 文件,这是非常多的unix 文件,所以我们可以忽略CR 问题。

期望的输出:

358890,more
,text,here,44,,,, etc
985678,93838,text,,,,
,text,continuing,from,previous,line,,, etc

Line 4: 358890,more
,text,here,44,,,, etc 

Line 7: 985678,93838,text,,,,
,text,continuing,from,previous,line,,, etc

非常感谢。

【问题讨论】:

  • 您如何确定一条记录的开始和结束位置?它们都具有相同数量的字段吗?
  • @123 是的,它们的字段数相同,字段分隔符为,。但问题是,我不知道有多少字段。我可以使用文件头找到这个,对吗?
  • 我们不知道,这取决于。符合 RFC-4180 的 CSV 应该有一条记录,而你的没有,所以我们无法做出任何假设
  • 也许你可以通过查看文件推断出其他规则。以数字开头的每一行是否都标志着新记录的开始?是否只有以逗号开头的行标记当前记录的延续?
  • 在您的示例中,几乎每个“记录”都有不同数量的字段。您确定要向我们提供具有代表性的数据样本吗?

标签: bash perl csv unix


【解决方案1】:

您可以使用 perl 计算字段数(逗号),并追加下一行,直到达到正确的数字

perl -ne 'if(tr/,/,/<28){$line=$.;while(tr/,/,/<28){$_.=<>}print "Line $line: $_\n"}' file

【讨论】:

  • 爱上perl。 :)
【解决方案2】:

我很喜欢 Perl,但我认为它不是这项工作的最佳工具。

如果您想要报告所有没有完全正确数量的逗号/分隔符的行,您可以使用 unix 语言 awk

例如这个命令:

/usr/bin/awk -F , 'NF != 8' < csv_file.txt

将打印所有不完全包含7 commas 的行。逗号用-F指定为字段,字段数用NF指定。

【讨论】:

  • 这会遇到包含逗号的引用文本的行的问题。
  • 好主意。字段分隔符可以是正则表达式而不是单个字符。如果文本中出现任何分隔符(逗号),则需要对其进行转义,并且正则表达式可以解释转义字符。
  • @TRowe 很有趣。我有时会使用awk,尽管我还是个学习者。我没有这样想,但逻辑是有道理的。我还没有完全检查我的所有文件,但是如果其中一个文件在引用的文本中有逗号,我们会看看结果如何。但是 123 的答案仍然比您的答案有优势 - 打印行号。这也可以通过awk 完成吗?
  • NR 号码:awk -F , 'NF != 8 {print NR, $0}' &lt; csv_file.txt
  • 让我明天检查一下。 :)
猜你喜欢
  • 2017-02-28
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
相关资源
最近更新 更多