gpt4 book ai didi

c - 从巨大的 .csv 文件中过滤文本,使用 C 语言

转载 作者:行者123 更新时间:2023-11-30 18:41:24 25 4
gpt4 key购买 nike

我在 csv 文件中有原始且未经过滤的记录(超过 1000000 条记录),我想从文件列表中过滤掉这些记录(每个文件大小超过 282MB;大约超过 2000000 条记录)。我尝试在 C 中使用 strstr。这是我的代码:

while (!feof(rawfh)) //loop to read records from raw file
{
j=0; //counter


while( (c = fgetc(rawfh))!='\n' && !feof(rawfh)) //read a line from raw file
{
line[j] = c; line[j+1] = '\0'; j++;
}
//function to extract the element in the specified column, in the CSV
extractcol(line, relcolraw, entry);

printf("\nWorking on : %s", entry);


found=0;
//read a set of 4000 bytes; this is the target file
while( fgets(buffer, 4000, dncfh)!=NULL && !found )
{
if( strstr(buffer, entry) !=NULL) //compare it
found++;
}
rewind(dncfh); //put the file pointer back to the start

// if the record was not found in the target list, write it into another file
if(!found)
{
fprintf(out, "%s,\n", entry); printf(" *** written to filtered ***");
}
else
{
found=0; printf(" *** Found ***");
}
//I hope this is the right way to null out a string
entry[0] = '\0'; line[0] ='\0';

//just to display a # on the screen, to let the user know that the program
//is still alive and running.
rawreccntr++;
if(rawreccntr>=10)
{
printf("#"); rawreccntr=0;
}
}

此程序平均需要大约 7 到 10 秒来搜索目标文件 (282 MB) 中的一项。所以,10*1000000 = 10000000 秒:(如果我决定在 25 个文件中搜索,天知道要花多少时间。

我正在考虑编写一个程序,而不是用勺子喂解决方案(grep、sed 等)。哦,抱歉,我使用的是 Windows 8(64 位、4 GB RAM、AMD 处理器 Radeon 2 核心 - 1000Mhz)。我使用 DevC++ (gcc) 来编译它。

请告诉我你的想法。

提前致谢,如果我听起来很愚蠢,抱歉。

<小时/>

更新者Ali ,从评论中提取的关键信息:

我有一个原始 CSV 文件,其中包含客户电话号码和地址的详细信息。我有 CSV 格式的目标文件;请勿调用列表。我想编写一个程序来过滤掉“请勿调用”列表中不存在的电话号码。电话号码(两个文件)位于第二列中。但是,我不知道还有其他方法。我搜索了 Boyer-Moore 算法,但是无法在 C 中实现该算法。关于我应该如何搜索记录有什么建议吗?

最佳答案

已编辑

我建议您尝试使用任何 Unix/Linux 系统中的现成工具,grepawk。您可能会发现它们同样快速并且更容易维护。我没有看到你的数据格式,但你说电话号码在第二列,所以你可以像这样自己获取电话号码:

awk '{print $2}' DontCallFile.csv

如果您的电话号码用双引号引起来,您可以像这样删除它们:

awk '{print $2}' DontCallFile.csv | tr -d '"'

然后您可以将 fgrep-f 一起使用选项,搜索一个文件中列出的字符串是否存在于第二个文件中,如下所示:

fgrep -f file1.csv file2.csv

或者您可以通过添加 -v 反转搜索并搜索其他文件中不存在的字符串。切换到fgrep

所以,你的最终命令可能会像这样:

fgrep -v -f <(awk '{print $2}' DontCallFile.csv | tr -d '"') file2.csv

也就是说...在 file2.csv 中搜索文件“DontCallFile.csv”第 2 列中不存在的所有字符串(-v 选项)。如果你想了解 <() 中的内容它被称为进程替换,它基本上根据运行括号内的命令的结果生成一个伪文件。我们需要一个伪文件,因为 fgrep -f需要一个文件。

原始答案

你为什么要使用 fgetc() 呢?当然你会像这样使用 getline() :

 while(getline(myfile,line ))
{
...
}

您真的从头开始读取主文件中每一行的整个“目标”文件吗?那会杀了你!为什么要以 4,000 字节为单位进行操作?如果您的一个字符串跨越了与之比较的 4,000 个字节,即前 8 个字节位于一个 4k block 中,而最后一个字节位于接下来的 4k block 中,该怎么办?

我认为,如果您花时间正确解释您想要做什么,您会在这里得到更好的帮助 - 也许可以使用 awk 或 grep 来完成(至少是象征性的),这样我们就可以看到您实际上想要做什么达到。例如,您的描述没有提及您在代码中使用的“目标”文件。

关于c - 从巨大的 .csv 文件中过滤文本,使用 C 语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21953542/

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