gpt4 book ai didi

windows - 在 Windows 上解析一个非常大的文本文件

转载 作者:可可西里 更新时间:2023-11-01 10:27:55 24 4
gpt4 key购买 nike

我有一个 2GB 的文本文件和一个 500MB 的文本文件。 2GB 的格式有点愚蠢:例如示例:

CD 15IG ABHNU 1223**CD 17IG RFTNU 3254**

其中**是记录之间的标记。

我需要提取CD为某个值的NU的所有值;然后我需要浏览 500MB 的文本文件,然后将其中的所有记录与 2GB 文件中的 NU 值进行匹配,然后将这些记录写入新文件。

我懂 PHP。除了文件的大小之外,这在 PHP 中是微不足道的。即使使用 fgets 一次读取一行也不会真正起作用,因为它需要永远,然后在本地主机中使我的计算机崩溃(在 XAMPP 下,apache.exe 会增长以耗尽所有系统内存)。加上用 PHP 做这件事会很痛苦(它是为非技术人员运行的,所以他们需要在每周可用时从 FTP 服务器下载 2GB 和 500MB;将它们上传到我的不稳定的 FTP 服务器在如此大的文件大小上;在我的服务器上运行一个需要很长时间的脚本)。

我懂一点 VBScript,不懂 Perl,不懂 .NET,不懂 C# 等等。我怎样才能编写一个基于 Windows 的程序,在本地运行,一次加载一行文件,并且不会因为文件大小?

最佳答案

下面将创建一个散列(一种关联数组),其中每个 NU 都有一个(小)元素,以便在第二个文件中找到。该散列的大小取决于您在第一个文件中有多少匹配记录。

如果仍然占用太多内存,将第一个文件分解成更小的部分,多次运行该程序,然后连接结果。

use strict;
use warnings;

my $qfn_idx = '...';
my $qfn_in = '...';
my $qfn_out = '...';

my $cd_to_match = ...;

my %nus;
{
open(my $fh_idx, '<', $qfn_idx)
or die("Can't open \"$qfn_idx\": $!\n");

local $/ = "\n**\n";
while (<$fh_idx>) {
next if !( my ($cd) = /^CD ([0-9]+)/m );
next if $cd != $cd_to_match;
next if !( my ($nu) = /^NU ([0-9]+)/m );
++$nus{$nu};
}
}

{
open(my $fh_in, '<', $qfn_in)
or die("Can't open \"$qfn_in\": $!\n");
open(my $fh_out, '>', $qfn_out)
or die("Can't create \"$qfn_out\": $!\n");

local $/ = "\n**\n";
while (<$fh_in>) {
next if !( my ($nu) = /^NU ([0-9]+)/m );
next if !$nus{$nu};
print($fh_out $_);
}
}

关于windows - 在 Windows 上解析一个非常大的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8996133/

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