Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl将文本文件解析为csv文件_Csv_Perl - Fatal编程技术网

如何使用Perl将文本文件解析为csv文件

如何使用Perl将文本文件解析为csv文件,csv,perl,Csv,Perl,我正在学习Perl,希望使用Perl将文本文件解析为csv文件。我有一个生成以下文本文件的循环: //This part is what outputs on the text file for $row(@$data) { while(my($key,$value) = each(%$row)) { print "${key}=${value}, "; } print "\n"; } 文本文件输出: name=Mary, id=23

我正在学习Perl,希望使用Perl将文本文件解析为csv文件。我有一个生成以下文本文件的循环:

//This part is what outputs on the text file
for $row(@$data) {
  while(my($key,$value) = each(%$row)) {
    print "${key}=${value}, ";
  }
  print "\n";
}
文本文件输出:

name=Mary, id=231, age=38, weight=130, height=5.05, speed=26.233, time=30, 
time=25, name=Jose, age=30, id=638, weight=150, height=6.05, speed=20.233, 
age=40, weight=130, name=Mark, id=369, speed=40.555, height=5.07, time=30 
CSV文件所需输出:

name,age,weight,height,speed,time
Mary,38,130,5.05,26.233,30, 
Jose,30,150,6.05,20.233,25, 
Mark,40,130,5.04,40.555,30

欢迎任何好的反馈

这里的关键部分是如何处理数据,以便提取每行需要打印的内容。然后您最好使用一个模块来生成有效的CSV,这非常好

一种程序,使用一组小的hashref,模拟问题中的数据

use strict;
use warnings;
use feature 'say';

use Text::CSV;

my @data = ( 
    { name => 'A', age => 1, weight => 10 },
    { name => 'B', age => 2, weight => 20 },
);
    
my $csv = Text::CSV->new({ binary => 1, auto_diag => 2 });

my $outfile = 'test.csv';
open my $ofh, '>', $outfile or die "Can't open $outfile: $!";

# Header, also used below for order of values for fields 
my @hdr = qw(name age weight);
$csv->say($ofh, \@hdr);

foreach my $href (@data) {
    $csv->say($ofh, [ @{$href}{@hdr} ]); 
}
使用hashref
@{$href}{@hdr}
按所需顺序提取hashref中的值

@{ expression returning hash reference } { list of keys } 但使用模块构建有效的CSV记录要安全得多。通过在构造函数中正确选择属性,它可以处理嵌入字段中的任何合法内容(一些需要花费大量工作才能手工正确完成的内容),并调用不合法的内容

  • 我明确列出了列名。相反,您可以获取
    ,然后按照所需的顺序进行
    排序
    ,但这同样需要硬编码列表进行排序

  • 程序创建文件
    test.csv
    ,并将预期的标题和数据行打印到其中


    †但用逗号分隔这些“值”可能不仅仅是“CSV格式”的首字母缩略词所代表的意思。在这些逗号之间可能会出现各种情况,包括逗号、换行符等等。这就是为什么人们最好总是使用图书馆。查看构造函数的选项可以提供信息


    以下评注提到了最初的问题。与此同时,OP的代码中纠正了这些问题,并更新了问题。我仍在留下这篇文章,希望得到一些有用的一般性评论

    至于问题中的代码及其输出,几乎可以肯定的是,根据输出中是否存在键
    哈希(地址)
    判断,如何处理数据以生成
    @data

    当打印作为散列引用的变量(不能显示任何散列内容)时,输出该字符串
    散列(0x…
    )。Perl通过这种方式(从更复杂的内容中生成可打印的字符串)引用来处理这种打印

    没有充分的理由为哈希键提供哈希引用。所以我建议你回顾一下你的数据及其处理过程,看看是如何产生的。(或者简单地展示一下,或者在不可行的情况下发布另一个问题。)


    一个可以绕过的度量方法是只使用一个您知道有效的密钥列表,如我上面所示;但是,您可能会留下一些未处理的直接错误。因此,我建议找出问题所在。

    是的,没有空格只是想在这篇文章中清楚地说明问题。好的,换了!为了提供更多帮助,我们还需要查看
    $data
    。而且,听起来您并不是在解析CSV文件。看起来您正在创建一个CSV文件。我想从该文本文件创建一个CSV文件。数据是一个散列数组,类似于zdim所做的。@BeBeBe很棒,我很高兴听到:)。我删除了一些我早期的评论,这些评论现在已经过时了(因为它们是通过编辑问题来解决的),以进行清理,这样它们就不会分散我的注意力。因为我看到你实现了我关于代码的最后一条评论,所以我编辑了你的问题以更正一些地方;请审阅。谢谢@zdim,是的,它应该是大写的,散列并添加了逗号,将尝试您的示例!CSV是将该文本文件解析为CSV的唯一方法吗?我正在考虑编写一个perl脚本,用几行代码将该文本文件解析为csv:)@Bebe我假设您以某种方式“解析”(处理)某个文件以获取
    @数据。然后需要使用它来获取输出值(
    Mary
    38
    130
    ,…等等);为此,我使用
    {$href}{@hdr}
    。一旦你有了它,你就可以把它打印到一个文件中,在值之间加一个逗号。为此,我使用(并建议)
    Text::CSV
    打印CSV样式的输出(CSV代表逗号分隔的值)。但对于简单数据,您可以手动执行(如注释所示)@Bebe请参阅我编写的
    @data
    ——这就是具有哈希引用的数组的外观。如果输出中有一个
    散列(..)=>
    ,这意味着有一个本身就是散列引用的键。我不知道为什么会这样,但几乎可以肯定这是某种错误。调查原始数据(在获取原始数据的文件中)以及如何处理原始数据以获取您的
    @data
    (那么,如何“解析”该文件以从中构建
    @data
    。@Bebe感谢您澄清和编辑
    哈希(…)
    这件事!我在回答的末尾加上了这方面的评论
    say $ofh join ',', @{$href}{@hdr};