【问题标题】:Perl script to read a csv file from a particular row to end of filePerl 脚本从特定行读取 csv 文件到文件末尾
【发布时间】:2023-03-12 18:23:01
【问题描述】:

我有一个包含以下内容的 CSV 文件 my.csv

abc,yyy

efg,zzz

zsc,vvv

uvw,ggg

根据变量$X 中的值,我需要从该特定值读取直到文件结束。例如:

如果$X = efg,则输出为:

efg,zzz

zsc,vvv

uvw,ggg

对于$X = zsc

zsc,vvv

uvw,ggg

这是我开发的脚本,它读取 CSV 文件的全部内容并显示出来:

use strict;
use warnings;

open(my $data, '<', $file) or die "Could not open '$file' $!\n";

while (my $line = <$data>) {  
    chomp $line; 
    my @field = split "," , $line;
    print "$field[0] $field[1]";
}

请帮我编写一个脚本来显示上述场景。

【问题讨论】:

  • 我对 perl 很陌生,我只知道阅读整个文件并显示...使用严格;使用警告; my $file = $ARGV[0] or die "Need to get CSV file on the command line\n"; my $sum = 0;open(my $data, '){ chomp $line;我的@fields = split "," , $line; print "$field[0] $fields[1]";}...请需要一个脚本来实现上述目标

标签: perl csv perl-module


【解决方案1】:

此解决方案跳过第 1 行到匹配文本 if (1 .. /\b$start_word\b/) 并将匹配文本中的所有行打印到文件末尾。

#!/usr/bin/perl
use strict;
use warnings;

my $start_word = 'efg';
my @data;

while (<DATA>) {
    chomp;
    if (1 .. /\b$start_word\b/) {
        #print if /\b$start_word\b/;
        @data = [split /,/] if /\b$start_word\b/;
    }
    else {
        #print;
        push @data, [split /,/];
    }
}

# Do something with @data

__DATA__
abc,yyy
efg,zzz
zsc,vvv
uvw,ggg

【讨论】:

  • "打印 if /\b$start_word\b/";这行做什么...如果起始词是 efg....输出应该是 efg,zzz zsc,vvv uvw,ggg ....这个工作...
  • 这条线是做什么的。如果该行包含起始字'efg',则打印当前行(然后是它之后的每一行到文件末尾)。复制我的代码并运行它以查看它是否有效。
  • 感谢您的帮助,它确实显示了 efg 之后的字段....有什么方法可以在逐行解析 csv 的同时在变量中一一提取这些值,这样我就可以传递给另一个子例程,以进一步实现获得的这些值...非常感谢您的帮助
【解决方案2】:

如果您只想打印第一个字段等于或大于指定值的行(例如,$X),请使用条件:

if ($field[0] >= $X) { 
    print ... 
}

【讨论】:

  • csv 内容已更改...现在怎么样...如果它的所有字符串都像上面那样...有什么办法可以这样做
  • @ysth 你现在能检查一下吗..我修改了我的问题并包含了示例脚本
  • 你现在可以检查一下吗..我修改了我的问题并包含了示例脚本
  • 那是另一种情况。我会使用一个标志变量来表示某个字符串是否已经出现,然后打印该行(如果有)。
猜你喜欢
  • 2012-08-26
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多