Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.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文件中删除某些行_Perl_Csv - Fatal编程技术网

Perl 基于排序列表从CSV文件中删除某些行

Perl 基于排序列表从CSV文件中删除某些行,perl,csv,Perl,Csv,我有一个约175M行的CSV文件(大.CSV)和另一个约50行的CSV文件(小.CSV)。我必须浏览large.csv,直到找到包含small.csv中第一行的行并删除该行。从那里开始,我需要找到一行,其中包含small.csv中的第二行,并将其删除,依此类推,直到我到达small.csv的末尾(所有行都将按照现在的顺序进行匹配) 这是我能够拼凑的,但我只是把原始文件拿回来: use strict; use warnings; use File::Copy; my $delete = 'sm

我有一个约175M行的CSV文件(大.CSV)和另一个约50行的CSV文件(小.CSV)。我必须浏览large.csv,直到找到包含small.csv中第一行的行并删除该行。从那里开始,我需要找到一行,其中包含small.csv中的第二行,并将其删除,依此类推,直到我到达small.csv的末尾(所有行都将按照现在的顺序进行匹配)

这是我能够拼凑的,但我只是把原始文件拿回来:

use strict;
use warnings;

use File::Copy;

my $delete = 'small.csv';
my $file = 'large.csv';
my $backup = "$file.bak";
copy $file, $backup or die "Copy failed: $!";

open my $in_dh, '<', $delete or die "$delete: $!";
open my $in_fh, '<', $backup or die "$backup: $!";
open my $out_fh, '>', $file or die "$file: $!";

my $match = <$in_dh>;
while (my $line = <$in_fh>) {
    if (index ($line, $match) == -1) {
        print $out_fh $line;
    } else {
        $match = <$in_dh>;
    }
}

close $in_dh;
close $in_fh;
close $out_fh;
使用严格;
使用警告;
使用文件::复制;
my$delete='small.csv';
my$file='large.csv';
my$backup=“$file.bak”;
复制$file、$backup或die“复制失败:$!”;

打开我的$in_dh,你不能
chomp
$match
结尾的行,因此除非匹配在行尾,否则它将失败。在从
small.csv
读取时,也不会检查是否点击了EOF

因为您的第一个文件很小,所以将其加载到数组中可能是最容易的。以下程序执行此操作,并使用
$^I
处理文件的就地编辑:

use strict;
use warnings;
use 5.010;

my @needles;
while (<>) {
    chomp;
    push @needles, $_;
    last if eof;
}

{
    local $^I = '.bak';

    my $needle = shift @needles;
    while (<>) {
        chomp;

        if (! defined $needle or index($_, $needle) == -1) {
            say;
        }
        else {
            $needle = shift @needles;
        }
    }
}

其中,
pines
是包含要搜索的字符串的文件,
haystack
是要搜索的文件。

您不能
chomp
$match
结尾的行,因此除非匹配在行的末尾,否则它将失败。我猜这是你的问题,因为你说的都是“它不起作用。”他说的<在比较之前,先选择code>chomp
,以消除将事情搞砸的换行符。另外,请使用更具体的故障描述和所采取的任何故障排除步骤编辑您的帖子。谢谢,我添加了
chomp
,但在运行脚本后,我得到了一个空文件。这是因为
索引(chomp$line,$match)
chomp
s
$line
@adrianhh“我需要找到一行包含…”表示OP正在搜索子字符串,而不是相等。谢谢,这运行得非常快!
/path/to/script needles haystack