【问题标题】:Read a CSV file in bash在 bash 中读取 CSV 文件
【发布时间】:2012-09-28 19:09:20
【问题描述】:

我需要在 shell 中读取 CSV 文件,我可以接受单元格中包含单行的 CSV 文件。但是如果我们在 CSV 文件的单元格中有多行,那么我无法分隔 CSV 文件。

Filename            Lines
/etc/hosts          example.test.com
                    example2.test.com
/etc/resolv.conf    nameserver dns.test.com
                    search test.com

我将在 CSV 文件中从用户那里获取输入,并且必须将给定的行添加到提到的文件中。在这里,CSV 文件的每个单元格中都有多行,如果我尝试对文件进行分类,它会以不同的顺序给出。

[user2@mon ~]$ cat test2.csv
"Filename","Lines"
"/etc/hosts","example.test.com"
,"example2.test.com"
"/etc/resolv.conf","nameserver dns.test.com"
,"search test.com"

有什么方法可以从该文件中读取多行,并且行数始终不一样。

【问题讨论】:

标签: linux bash shell csv


【解决方案1】:

这可能是你所追求的:

awk -F, '{ sub(/^"/, "", $1); sub(/"$/, "", $1);
           sub(/^"/, "", $2); sub(/"$/, "", $2);
           printf "%-20s  %s\n", $1, $2;
         }'

如果您花更多时间手动抨击,则很有可能压缩替代操作。这是一个脆弱的解决方案(大多数不使用专门用于处理 CSV 格式的代码的解决方案都是脆弱的);如果逗号出现在任何引号括起来的字段中,它会非常失败。

应用于您的数据,它产生:

Filename              Lines
/etc/hosts            example.test.com
                      example2.test.com
/etc/resolv.conf      nameserver dns.test.com
                      search test.com

可靠地操作 CSV 格式数据的其他可能工具包括:

如果这不是您要查找的内容,请澄清问题。

【讨论】:

  • 感谢您的输入,它真的很有帮助,输入将包含几乎所有的特殊字符。有没有其他编程语言可以实现的方法,比如 perl。有什么方法可以直接调用 CSV 文件的单元格编号会很有帮助。
  • 大多数 CSV 文件没有手机,所以你不能打电话给他们 :D 我不太确定你想要什么。但是,如果您要查找 CSV 文件的第 78 行第 4 列,该文件可以包含任意数据,包括引用字段中的逗号等,那么您需要一个专门的 CSV 感知模块。我在答案中列出了 2 个选项。在这两者中,我可能会使用 Perl,但我已经使用 Perl 大约 20 年了,所以我已经很习惯了。 csvfix 程序是用 C++ 编写的,可以做很多非常有用的技巧;我不确定它是否会管理第 79 行第 4 列(但它可能会这样做)。
  • 谢谢乔纳森,请告诉我如何使用 perl 来完成这项工作。在我看来,单元格编号只不过是列号。
  • 请具体一点;你到底想要什么?第 2 列中的所有值,包括标题行,打印到标准输出,如果有的话,字段值周围的引号是否被删除?
  • 这个 Perl 'one-liner' 将打印即使是最复杂的 CSV 格式文件的第 2 列:perl -MText::CSV -e '$csv=Text::CSV->new({binary=>1})or die;while(my$row=$csv->getline(STDIN)){print"$row->[1]\n"; }' <data。对您的数据进行测试;产生第 2 列的输出。
【解决方案2】:

假设您的输入与您的示例一样基本,您可能只需执行以下操作即可逃脱:

sed 's/^,/ ,/' test2.csv | tr -d \" | column -s, -t

【讨论】:

  • 反对票是怎么回事?显然,这个解决方案没有声称稳健性或可靠性,并且在没有评论的情况下对一个 6 个月大的解决方案投反对票简直是粗鲁!
猜你喜欢
  • 2019-08-03
  • 1970-01-01
  • 2015-02-01
  • 2014-04-13
  • 1970-01-01
  • 2010-11-27
  • 2016-04-09
  • 2023-03-22
  • 2011-07-24
相关资源
最近更新 更多