找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: w31575801

[文本处理] 【已解决】批处理如何根据指定字符匹配CSV一列数据的该行数据

[复制链接]
 楼主| 发表于 2021-1-28 09:43:44 | 显示全部楼层
回复 14# Batcher


    可以提取 但是文件大的话也是相当慢
 楼主| 发表于 2021-1-28 09:46:09 | 显示全部楼层
回复 15# Batcher


    gawk这个命令出来 会有这个
发表于 2021-1-28 09:48:43 | 显示全部楼层
回复 16# w31575801


请给出量化的数据吧,比如:
SN.txt 5万行
需要提取的LOG.csv 50万行
6楼代码执行耗时 xxx
8楼代码执行耗时 xxx
 楼主| 发表于 2021-1-28 09:53:07 | 显示全部楼层
回复 18# Batcher


    附件太大 上传不了
 楼主| 发表于 2021-1-28 10:00:49 | 显示全部楼层
本帖最后由 w31575801 于 2021-1-28 10:02 编辑

回复 18# Batcher


    SN.TXT 一共91535个SN码 即91535行
需要查找的Log 共560000个 12GB

我是分一点点找 120MB 查找的话需要3小时左右 gawk我还没尝试  因为上夜班刚回家数据在公司
发表于 2021-1-28 13:43:48 | 显示全部楼层
win10 可以写个,其它免麻烦
发表于 2021-1-28 17:04:09 | 显示全部楼层
回复 21# xczxczxcz

这么厉害,运行速度超快啊。
发表于 2021-1-28 17:55:27 | 显示全部楼层
本帖最后由 Gin_Q 于 2021-1-28 17:57 编辑

560000 * 91535 = 51259600000
读取一行log文件,再去 sn 里面查找匹配
不知道大家有没有更优的方法

启用多线程分块匹配应该可以优化很多
发表于 2021-1-28 22:10:16 | 显示全部楼层
1一次取5600行到内存,开5个工作线程,每个线程用KMP算法搜索18307个SN码,输出含有SN码的行号;
2.等所有线程工作完了,主线程打印出行号对应的完整行>>result.csv
3.重复步骤12一百次直到log文件被搜完
发表于 2021-1-29 09:37:46 | 显示全部楼层
有个思路不知可行不:
由于源文件一行内容太长,可将sn码与源文件中含有sn码的列(可用tokens=15提取)比对,这样可以屏蔽无关的字符。如果某行含有特定的sn码,获得行号。得到所有符合条件的行号后,再按得到的行号提取行。
发表于 2021-1-29 10:56:48 | 显示全部楼层
回复 24# 路过

我们想看代码是如何写的"?"
发表于 2021-1-29 15:07:15 | 显示全部楼层
回复 1# w31575801
按照25楼的思路,用3个for循环(实际是2个,第3个是为了只显示含有sn码的列,in里面只是一行字符串),不用效率较低的findstr。不知能否提高速度:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%a in (SN.txt) do (
  4.     for /f "delims=" %%b in (需要提取的LOG.csv) do (
  5.         for /f "tokens=15 delims=," %%c in ("%%b") do (
  6.         set "str=%%c"
  7.         set "str=!str:%%a=!"
  8.         if not "!str!"=="%%c" echo %%b
  9.         )
  10.     )
  11. ))>结果.csv
  12. pause
复制代码
发表于 2021-1-29 20:28:06 | 显示全部楼层
本帖最后由 WHY 于 2021-1-30 13:01 编辑

回复 27# qixiaobin0715


    set "s=a,b,,,c"
用delims=,分割的话,c位于第3列。实际上,在csv文件中,c位于第5列。

如果csv文件是这样的:
a,b,,,"c,d"
第5列变成 "c,d",纯批和 gawk 都会挂掉。
这样就需要正则匹配了:

  1. ^(?:"(?>[^"]+|"")*",|[^",]*,){14}("(?>[^"]+|"")*"|[^",]*)
复制代码
当然仅适合标准的 Microsoft CSV 文档。
发表于 2021-1-29 22:01:17 | 显示全部楼层
回复 28# WHY
确实有点欠考虑,是会有很大漏洞,并且可能出现的概率也不小。但文本的复杂性太多,有时正则也会失效。
比如这样的字符串:abcd,"a,bcd","a,b"cd,"a,b""c,d","a,b"e"d,e",a"b,c"d
所以写代码时还是要根据文本的实际情况处理。
发表于 2021-1-30 13:04:12 | 显示全部楼层
回复 29# qixiaobin0715


    严重同意,具体问题具体分析。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 19:08 , Processed in 0.031587 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表