在CSV列“city”中搜索提供的list.csv上带有标题列“city”的值。如果发现删除

时间:2012-08-20 19:20:17

标签: perl

我有大约10-20K的记录,只需要某些城市。我想在perl中完成这项工作,但我似乎无法找到我需要的一个例子。 searchme.csv和list.csv如果找到城市删除记录/行。我正在对屏幕进行排序和分割,但现在只有很多方法可以选择。请任何帮助将不胜感激。我只是一个nueb。

  1. searchme.csv包含名称,地址,城市,州,邮政编码,电话'标题。
  2. list.csv包含1行标题' city'和我要保留的50多排城市。
  3. 因此,对于searchme.csv中的每一行,都可以获得“城市”。进入$ variable并通过list.csv循环,如果匹配,则将searchme.csv中的完整行写入新文件new.csv。我玩的越多,我就把它循环到searchme.csv上,我想我需要将cities.csv加载到数组中并通过while循环中的数组循环。如果发现打印到new.csv。

1 个答案:

答案 0 :(得分:0)

我无法从你上次发表的评论中说出你是否还在努力。无论如何,这是一个需要考虑的解决方案。

use strict;
use warnings FATAL => 'all';
use autodie qw(:all);

# slurp files into arrays
open my $RECORDSFILE, '<', 'searchme.csv';
my @records = <$RECORDSFILE>;
close $RECORDSFILE;

open my $LISTFILE, '<', 'list.csv';
my @citychecklist = <$LISTFILE>;
close $LISTFILE;

open my $NEWFILE, '>>', 'new.csv';

my $cityidx = 2;
my $item;
my $record;

# loop through each record and extract the city string
foreach $record (@records) {
    my @data = split qr/,/, $record;
    my $city = $data[$cityidx];
    # skip the header
    next if $city eq 'city';

    # compare the city string with each city in our other list
    foreach $item (@citychecklist) {
        chomp $item;
        # if we find a match write out the record to another file
        if ($city eq $item) {
            print {$NEWFILE} $record;
        }
    }
}

close $NEWFILE;