我正在尝试解析一个给定的CSV文件,流在定期的基础上。
我的要求是通过列名(标题)访问数据。列名不在第1行中。列名在第2行中。CSV确实有100行,但我只需要导入2个数据行。分隔符是一个制表符。
下面的脚本适用于第1行的标题和文件中的所有行,我未能将其修改为第2行的标题,并且仅使用2行或多行。
脚本:
#!/usr/bin/perl
use strict;
use warnings;
use Tie::Handle::CSV;
use Data::Dumper;
my $file = "data.csv";
my $fh = Tie::Handle::CSV->new ($file, header => 1, sep_char => "\t");
my $hfh = Tie::Handle::CSV->new ($file, header => 0, sep_char => "\t");
my $line = <$hfh>;
my $myheader;
while (my $csv_line = <$fh>)
{
foreach(@{$line})
{
if ( $_ ne "" )
{
print $_ . "=" . $csv_line->{$_} . "\n" ;
}
}
}
Data.csv可能如下所示:
This is a silly sentence on the first line
Name GivenName Birthdate Number
Meier hans 18.03.1999 1
Frank Thomas 27.1.1974 2
Karl Franz 1.1.2000 3
Here could be something silly again
谢谢你的提示。
顺祝商祺
4条答案
按热度按时间5hcedyr01#
使用
Text::CSV_XS
代替Tie::Handle::CSV
(这取决于模块,因此您已经安装了它),读取并丢弃第一行,使用第二行设置列名,然后读取其余数据:djmepvbi2#
Tie::Handle::CSV接受文件句柄而不是文件名。在将文件句柄传递给Tie::Handle::CSV之前,您可以通过阅读第一行来跳过第一行:
sgtfey8w3#
多亏了你们俩。
更详细地阐明我的要求。
原始数据文件可能有100个列,这些列的动态名称对我来说是未知的。我将从其他服务创建列/属性列表,此脚本应提供这些列的数据内容。
请求是在数据方面的例子:请提供前25行的所有姓名和所有出生日期。下一个请求可以是前10行的所有姓名和Givenames。
这意味着从100列的内容中,我必须提供两列、四列、五列的内容。
我使用的输出(foreach),只是为了测试通过ColumName访问行的内容。
我混淆了您的解决方案,并选择了Tie::Handle::CSV。
目前我必须使用两个文件句柄-也许你有一个更有效的提示。
z0qdvdin4#
谢谢,用“keys %$csv_line”运行它。我没有使用,因为缺少knowlegde。- )
关于最后一个问题:我读取的文件将被其他程序填充和修改。我可以做什么来检测文件违规的情况下,它使一个问题。我不知道什么我的脚本死了。
谢谢