【问题标题】:Split in csv file using perl?使用perl拆分csv文件?
【发布时间】:2013-03-12 02:38:34
【问题描述】:

朋友们,我有两个 CSV 文件需要转换为电子表格。它包含以下数据;

"xxx","yyy","97,234"
     .
     .
     .

abc,def,"23,475"
       .
       .
       .
       .

现在的问题是我需要打开这个 csv 文件并将每条记录写入另一个文件。我已经尝试使用拆分功能作为split(,@lines) 这将拆分所有逗号分隔的值,所以第一个文件的第三条记录也一分为二!。所以我尝试了另一种方法split(",@lines)此方法不支持第二个文件!使用 perl

处理这种情况的任何方法

【问题讨论】:

  • split(,@lines)split(",@lines) 甚至不接近有效的 perl 代码。加入文件不需要解析csv,这是cat的工作:cat file1.csv file2.csv > file3.csv

标签: regex perl excel csv


【解决方案1】:

使用 Text::CSV 解析 CSV 文件。 Text::CSV 的示例用法如下:

#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;
$\="\n";

open my $fh, '<', 'file.csv' or die $!;
my $csv=Text::CSV->new;
while(<$fh>){
        $csv->parse($_);
        my @fields=$csv->fields();
}
close $fh;

数组 @fields 包含 csv 文件的所有单独列。

【讨论】:

  • 所以引号被删除了?
  • 所以你的意思是 "xxx","yyy","97,234" 看起来像:xxx,yyy,97234 这看起来像 abc,def,23475 对吗?
  • @Thiyagu ATR:我会使用调试选项 (perl -d myscript.pl) 运行它来检查它是如何处理这个问题的
  • @ThiyaguATR :是的,它会删除各个列中的引号...但是,当您使用 combine 方法组合字段时,它会回收引号..
【解决方案2】:

如果您需要将两个 CSV 文件中的所有记录复制到第三个文件中,那么您根本不需要拆分数据:只需在记录级别读取和写入数据即可。

如果出于某种您没有解释的原因,您确实需要将数据拆分为字段,那么您应该使用Text::CSV 模块来完成。尝试使用正则表达式拆分 CSV 数据通常很难做到正确,并且该模块已经过尝试和测试。

【讨论】:

  • @ThiyaguATR 我现在看到您的问题上有“excel”标签。如果您的问题是关于如何将 csv 转换为 excel,您应该将其包含在您的问题中。否则,人们很难弄清楚。虽然我觉得 Microsoft Excel 可以导入 csv 就好了。
  • 如果您需要将此数据转换为电子表格,那么最好使用电子表格应用程序打开 CSV 文件。
  • @all:no 我有很多 csv 文件,我需要通过自动化来完成这个过程!使用 perl!实际上我已经完成了 80% 的工作,最后我注意到了这个大探测器!
  • 那么答案就是我说的使用Text::CSV
【解决方案3】:

假设您不想将" 包含在输出中:

my @values = $line =~ /\"?(\w+)\"?,\"?(\w+)\"?,\"?([\d,]+)\"?/

将删除任何" 并将文本/数字存储在数组@values 中,然后您可以打印:

print join(";", @values) . "\n";

;作为分隔符打印它们。当我从你的问题中运行这两行时,我得到了这个输出:

$ ./testregexp.pl 
xxx;yyy;97,234
abc;def;23,475

【讨论】:

    猜你喜欢
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2021-05-21
    • 2018-05-04
    • 2013-03-04
    相关资源
    最近更新 更多