[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 14# Batcher


    可以提取 但是文件大的话也是相当慢

TOP

回复 15# Batcher


    gawk这个命令出来 会有这个

TOP

回复 16# w31575801


请给出量化的数据吧,比如:
SN.txt 5万行
需要提取的LOG.csv 50万行
6楼代码执行耗时 xxx
8楼代码执行耗时 xxx
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 18# Batcher


    附件太大 上传不了

TOP

本帖最后由 w31575801 于 2021-1-28 10:02 编辑

回复 18# Batcher


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

我是分一点点找 120MB 查找的话需要3小时左右 gawk我还没尝试  因为上夜班刚回家数据在公司

TOP

win10 可以写个,其它免麻烦
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

回复 21# xczxczxcz

这么厉害,运行速度超快啊。

TOP

本帖最后由 Gin_Q 于 2021-1-28 17:57 编辑

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

启用多线程分块匹配应该可以优化很多
QQ:1972544783

TOP

1一次取5600行到内存,开5个工作线程,每个线程用KMP算法搜索18307个SN码,输出含有SN码的行号;
2.等所有线程工作完了,主线程打印出行号对应的完整行>>result.csv
3.重复步骤12一百次直到log文件被搜完

TOP

有个思路不知可行不:
由于源文件一行内容太长,可将sn码与源文件中含有sn码的列(可用tokens=15提取)比对,这样可以屏蔽无关的字符。如果某行含有特定的sn码,获得行号。得到所有符合条件的行号后,再按得到的行号提取行。

TOP

回复 24# 路过

我们想看代码是如何写的"?"

TOP

回复 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
复制代码

TOP

本帖最后由 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 文档。

TOP

回复 28# WHY
确实有点欠考虑,是会有很大漏洞,并且可能出现的概率也不小。但文本的复杂性太多,有时正则也会失效。
比如这样的字符串:abcd,"a,bcd","a,b"cd,"a,b""c,d","a,b"e"d,e",a"b,c"d
所以写代码时还是要根据文本的实际情况处理。

TOP

回复 29# qixiaobin0715


    严重同意,具体问题具体分析。

TOP

返回列表