gpt4 book ai didi

perl - 使用 Perl 解析 CSV 文件从特定行到文件末尾

转载 作者:行者123 更新时间:2023-12-04 18:47:18 25 4
gpt4 key购买 nike

我对 Perl 很陌生,需要你的帮助

我有一个 CSV 文件 xyz.csv内容:

这里的 level1 和 er 值是字符串名称...不是数字...

level1,er
level2,er2
level3,er3
level4,er4

我使用下面的脚本解析这个 CSV 文件,并在第一次运行时将字段传递给一个数组
open(my $d, '<', $file) or die "Could not open '$file' $!\n";
while (my $line = <$d>) {
chomp $line;
my @data = split "," , $line;
@XYX = ( [ "$data[0]", "$data[1]" ], );
}

对于第二次运行,我从命令提示符处获取输入并将其存储在变量 $val 中。 .我的程序应该从变量中存储的值解析 CSV 文件,直到它到达文件的末尾

例如

我输入 level2所以我需要一个脚本来解析从第二行到 CSV 文件的末尾,忽略 level2 之前的值在文件中,并将这些值( level2level4 )传递给 @XYX = (["$data[1]","$data[1]"],);}
level2,er2
level3,er3
level4,er4

我输入 level3所以我需要一个脚本来解析从第三行到 CSV 文件的末尾,忽略 level3 之前的值在文件中,并将这些值( level3level4 )传递给 @XYX = (["$data[0]","$data[1]"],);}
level3,er3
level4,er4

我如何做到这一点?请提出您的宝贵建议。我感谢您的帮助

最佳答案

只要您确定数据中从来没有任何逗号,您应该可以使用 split .但即便如此,将拆分限制为两个字段也是明智的,这样您就可以得到第一个逗号及其后的所有内容

您的代码存在一些问题。首先我希望你把use strictuse warnings在所有 Perl 程序的顶部。这个简单的措施会发现许多你可能会忽略的琐碎问题,因此在你寻求代码帮助之前尤其重要

它不是众所周知的,而是换行"\n"在您的 die 末尾string 阻止 Perl 在发生错误的输出中提供文件和行号的详细信息。虽然这可能是您想要的,但提供额外信息通常更有帮助

您的变量名非常无用,按照惯例,Perl 变量由小写字母数字和下划线组成。名称如 @XYX$W根本不帮我理解你的代码!

与其拆分为数组,不如将两个字段放入两个标量变量中以避免所有索引。我不确定你的意图是什么 @XYX = (["$data[1]","$data[1]"],) .首先你真的要使用$data[1]吗?两次?其次,你不应该把标量变量放在双引号内,因为它做了一些非常具体的事情,除非你知道那是什么,否则你应该避免它。最后,你的意思是push匿名数组到 @XYX每次循环?否则每次从文件中读取一行时,数组的内容都会被覆盖,之前的数据会丢失

该程序使用正则表达式提取$level_num从第一个字段。它所做的就是找到字符串中的第一个数字序列,然后可以将其与所需的最低级别 $min_level 进行比较。决定日志中的一行是否相关

use strict;
use warnings;

my $file = 'xyz.csv';
my $min_level = 3;
my @list;

open my $fh, '<', $file or die "Could not open '$file' $!";

while (my $line = <$fh>) {
chomp $line;
my ($level, $error) = split ',', $line, 2;
my ($level_num) = $level =~ /(\d+)/;
next unless $level_num >= $min_level;
push @list, [ $level, $error ];
}

关于perl - 使用 Perl 解析 CSV 文件从特定行到文件末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12214862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com