【问题标题】:perl - text processing - output to csv fileperl - 文本处理 - 输出到 csv 文件
【发布时间】:2011-03-16 13:48:39
【问题描述】:

perl 中有没有办法将数据从文件导出到 csv 文件。 我的意思是,

假设我有一个文件如下..

field1=value1,filed2=value2
field1=value3,filed2=value4
field1=value5,filed2=value6

我想将其导出为ex​​cel格式,如下所示。

field1  field2
value1  value2
value3  value4
value5  value6

无论如何要这样做??

另外,这里有个小问题。 假设我再将一个文件导出到同一个 CSV 文件中......其内容如下......

field1=value1,fields2=value8

我的 CSV 应该是这样的

field1  field2
value1  value2
        value8
value3  value4
value5  value6

有没有更简单的方法。现在我正在手动进行。任何想法是否有更好的方法。

谢谢。

【问题讨论】:

    标签: perl csv text-processing


    【解决方案1】:

    在读入新文件之前,请先读入目标 csv 文件(如果它不为空)。创建散列的散列。第一个哈希 HashA 的键将是 field1 的值。像 value1 这样的键的值将是一个散列 HashB。 HashB 将具有对应于 value1 的字段 2 值的键。 HashB 中键的值将只是“1”。 (不管它是什么。)

    现在,当您要导出第二个文件时,只需为 HashA 的每个键添加新键到 HashB。

    这是你的例子。

    首先你做第一个文件来获取

    value1 -> { value2 -> 1 }
    值3 -> { 值4 -> 1 }
    值5 -> { 值6 -> 1 }

    现在,当您在第二个文件中读取行 field1=value1,field2=value8 时,您只需为 value1 添加一个键到 HashB

    value1 -> { value2 -> 1, value8 -> 1 }
    值3 -> { 值4 -> 1 }
    值5 -> { 值6 -> 1 }

    现在,当您遍历 HashA 时,您会打印 column1 中的键(对于 field1)并打印 HashB 中的每个键。

    #!/usr/bin/perl
    
    %hashA = ();
    
    $hashA{"value1"}{"value2"} = 1;
    $hashA{"value3"}{"value4"} = 1;
    $hashA{"value5"}{"value6"} = 1;
    
    foreach $value1 ( sort keys %hashA ) {
        foreach $value2 ( sort keys %{ $hashA{$value1} } ) {
            print "$value1, $value2\n";
        }
    }
    
    $hashA{"value1"}{"value8"} = 1;
    
    print "\n\n";
    foreach $value1 ( sort keys %hashA ) {
        foreach $value2 ( sort keys %{ $hashA{$value1} } ) {
            print "$value1, $value2\n";
        }
    }
    

    【讨论】:

    • 嗯,道尔顿比我解决的问题更多。我只是在展示如何使用散列的散列。他的解决方案很好。一个小缺点是,如果您的文件很大且包含许多重复的 field1,那么您会复制 @formatted 中的值。 hash 的哈希值不会重复该值。不过,这很重要。
    • 谢谢。那很棒。但是现在,假设我的所有数据都在 %hashA 中,我该如何将其转储到 csv 文件中。我试着逐条记录地转储它。但是我的整个记录​​进入了单个单元格,而不是 field1、field2 等不同的单元格..
    • 对不起。我知道该怎么做。我只需要在打开文件时提供一个有效的分隔符。
    【解决方案2】:

    给你

    #!/usr/bin/env perl
    
    open (IMPORT, "import.txt") || die "Unable to read import file";
    
    my @lines = <IMPORT>;
    my @formatted = ();
    
    for my $line (@lines) {
        $line =~ s/^.*=(.*?),.*?=(.*?)/$1\t$2/g;
        push(@formatted, $line);
    }
    
    my $current_field;
    
    for my $format_line (sort @formatted) {
        my($field1, $field2) = (split(/\t/, $format_line));
        if ($field1 ne $current_field) {
            print "$field1";
        }
        print "\t$field2";
    
        $current_field = $field1;
    }
    

    import.txt 包含

    field1=value1,filed2=value2
    field1=value3,filed2=value4
    field1=value5,filed2=value6
    field1=value1,fields2=value8
    

    导致

    value1  value2
            value8
    value3  value4
    value5  value6
    

    【讨论】:

    • 谢谢 :) 很好的解决方案 :)
    【解决方案3】:

    查看Text::CSV(用于将您的 CSV 文件读入 perl 数据结构)和Spreadsheet::WriteExcel(用于以 Excel 格式写回该数据)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多