【问题标题】:CSV manipulation AWK?CSV 操纵 AWK?
【发布时间】:2013-05-24 10:59:03
【问题描述】:

我有两个 CSV 文件,一个有很长的参考编号列表,另一个是每日订单列表。

我每天都需要将参考编号剪切并粘贴到日常订单中。显然,我只剪切了与订单一样多的参考编号,因此例如,如果有 20 个订单,我需要从另一个文件中获取 20 个参考编号并粘贴到我的订单文件中。我削减了这些数字,这样我们就不会在接下来的几天里重复。

我想自动化这个过程,但我不知道最好的方法。我正在运行 Windows 并使用 AWK 进行其他一些 csv 操作,但我对 AWK 不是很有经验,不确定这是否可能,所以我只是想问是否有人对最佳解决方案有任何想法。

【问题讨论】:

  • 你能提供文件的摘录吗?
  • mvp 给了你一个很好的答案。除非你很幸运,否则你必须自己在 awk 中编写所有 CSV 解析代码。 Perl 已经有一个 CSV 库,并且与 awk 非常相似,因此您拥有的任何 awk 技能都应该主要翻译。如果您感到困惑,请使用 a2p,它是 perl 附带的实用程序,可将 awk 转换为 perl。
  • 发布一些示例输入和预期输出。听起来您想做的事情在 awk 中是微不足道的,但如果我非常怀疑您确实需要对所有样式的 CSV 文件进行全面解析,您可以从lorance.freeshell.org/csv 下载并使用 Stinsons CSV 解析器。

标签: perl csv awk


【解决方案1】:

正确解析 CSV 是一件非常棘手的事情。大部分困难来自于解析内容中的引号、双引号、逗号、空格等错误。

我建议不要重新发明轮子,而是使用一些经过良好测试的库。我认为 awk 没有,但 Perl 有:DBD::CSV

在Windows上,只需安装ActivePerl,它已经默认安装了DBD::CSV

然后,使用这样的 Perl 代码检索您的数据并在 while 循环中转换为其他格式:

use DBI;
my $dbh = DBI->connect("dbi:CSV:f_ext=.csv") or die $DBI::errstr;
my $sth = $dbh->prepare("SELECT * FROM mytable"); # access mytable.csv
$sth->execute();
while (my @row = $sth->fetchrow_array()) {
   print "id: $row[0], name: $row[1]\n";
}
# you can also access columns by name, like this:
# while (my $row = $sth->fetchrow_hashref()) {
#     print "id: $row->{id}, name: $row->{name}\n";
# }
$sth->finish();
$dbh->disconnect();

由于您提到您有 2 个输入 CSV 文件,您甚至可以使用 SQL 连接语句从两个表中同时获取正确连接的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    相关资源
    最近更新 更多