【问题标题】:Read from csv file and write output to a file从 csv 文件读取并将输出写入文件
【发布时间】:2015-07-23 13:19:49
【问题描述】:

我是Perl 的新手,希望在以下情况下得到您的帮助,请您帮忙解决这个问题。

我有一个包含以下信息的CSV 文件,我正在尝试从CSV 文件准备一个键值对。您能帮我解决以下情况吗?

Line 1: List,ID
Line 2: 1,2,3
Line 3: 4,5,6

Line 4: List,Name
Line 5: Tom, Peter, Joe
Line 6: Jim, Harry, Tim

我需要格式化上述CSV 文件以在新文件中获得输出,如下所示:

Line 1: ID:1,2,3 4,5,6
Line 2: Name:Tom,Peter,Joe Jim, Harry, Tim

您能否指导我如何在这种情况下使用 Perl 函数。

【问题讨论】:

  • 为什么不是Name:Tom, Peter, Joe Jim, Harry, TimName:Tom,Peter,Joe Jim,Harry,Tim?为什么只有一些逗号后面有空格?
  • 您希望写入什么样的文件?它是在纯文本文件上还是在另一个 CSV 或 excel 上?

标签: perl csv


【解决方案1】:

你很幸运,这在 Perl 中非常容易。

在 CPAN 上有一个名为 Text::CSV 的很棒的库,文档在这里:https://metacpan.org/pod/Text::CSV

页面顶部的概要提供了一个非常好的示例,它应该让您只需稍作修改即可做您想做的事情。

【讨论】:

  • 是的,我看过这个,但我的代码将在多台服务器上运行,并且所有用户都没有安装“使用 Text::CSV”模块。所以,我一直在寻找一个不带任何模块的代码示例。
【解决方案2】:

我认为这里的问题不在于 CSV 格式,而在于您有不同的列表与标题行分开。我还没有尝试过这段代码,但我认为你想要如下所示:

while (<>) {                      # Loop over stdin one line at a time
    chomp;                        # Strip off trailing newline
    my ($listToken, $listName) = split(',');
    next unless $listToken;       # Skip over blank lines
    if ($listToken =~ /^List/) {  # This is a header row
        print "\n$listName: ";    # End previous list, start new one
    } else {                      # The current list continues 
        print "$_ ";              # Append the entire row to the output
    }
}
print "\n";                       # Terminate the last line

请注意,这种文件格式有点可疑,因为没有办法让数据行的第一个值是文字“列表”。但是,我假设您在文件格式方面别无选择,或者您知道 List 不是合法值。

(注意 - 我修复了一个错误,我使用 $rest 作为变量;这是由于我在进行过程中重命名它们而丢失了一个)

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 2018-08-07
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    相关资源
    最近更新 更多