Autohotkey读取带有百万行的csv文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Autohotkey读取带有百万行的csv文件相关的知识,希望对你有一定的参考价值。

我的要求是通过grepping特定字符串并显示输出行来读取包含大约百万行的CSV文件。

示例CSV文件:

Rob,school,oxford,tennis
James,school,cambridge,cricket
lucy,college,harvard,football
lily,hotel,novotel,golf
..
..
..
1 million lines.

需求:

当我调用AHK脚本时,它会通过InputBox提示用户输入并将输入作为James school,它应该输出为cambridge。同样输入百合酒店,它应输出为novotel。

我能够通过下面的脚本实现所需的输出,但问题是当我搜索一个字符串,例如在第一百万行时,需要大约5-10分钟才能给出输出。

我写的脚本:

#SingleInstance, force
#Include C:UsersmpechettDesktopahk	f.ahk

InputBox, Name, Search for Name


StringSplit, word_array, Name, %A_Space%, .  ; Omits periods.

pattern = %word_array1%,%word_array2%


Outputline = % TF_Find("C:Usersmpechettexample.csv", "","", pattern, 1, 1)


MsgBox,%Outputline%

请帮助我提高脚本的性能。

答案

这是索引数据库类型解决方案的伪代码:

make_index() {
  global file := FileOpen( "database.csv", "r" )
  for each line in database {
    position  := file.pos
    line      := file.readline()
    values    := StrSplit(line)
    key       := make_a_unique_key(values)
    hash[key] := position
  }
  save hash to "database.index"
}

lookup(values) {
  global file, hash
  file.seek( hash[ make_a_unique_key( values )])
  return file.readline()
}

请参阅:File object的手动输入

另一答案

如果您使用RAMDISK,则可以加快搜索结果的速度。我看不到你的tf.ahk脚本是什么,但是5到10分钟是长的,1 - tf.ahk文件中的循环代码不好2 - 或者每次从你的HardDisk c搜索时都会这样做:而不是从你的公羊记忆。

你可以从这里下载免费软件Imdisk

  • RAMDISK是一个虚拟硬盘,放在你的Ram内存中。
  • RAMDISK比硬盘快+ 100倍。

首先在Windows系统上安装IMDISK,然后您可以简单地安装/放置/复制任何应用程序或将任何csv文件放入/复制到Ramdisk [example - z: example.csv]

Z: example.csv

Rob,school,oxford,tennis
James,school,cambridge,cricket
lucy,college,harvard,football
lily,hotel,novotel,golf
..
..
..
1 million lines.

注意:使用这个AHK键盘快捷键宏脚本,您可以键入 - 例如:大学,哈佛,然后它将在NotePad中进行搜索,它将给出结果值足球(这只是一个例子来测试它,更大您将需要的文件稍微改变一下代码并使用可以处理更大文件的其他应用程序(SpeadSheat program

Search.ahk

; this Script works on Windows 10 system.
; You can Click key, F1 to EXIT

#SingleInstance, force

run notepad.exe z:example.csv
WinWaitActive,example.csv, , 2



loop
{

InputBox,Clipboard,Search for Name
sleep 100
send ^{Home} ;goto Top of the Page
sleep 100
send ^f ;goto the Find box 
sleep 100
send ^v ;paste Clipboard Value
sleep 100
send {enter}
sleep 1500 ;You can change this sleep codeline - How bigger the search, how larger the sleep must be.
send {esc}
sleep 100

;If you want to Select the Whole Search Line - you can use this code.
;send {Home}
;sleep 100
;send +{End}

;If you want to Select the Rigth Site of the Line - you can use this code. 
send {Right}
sleep 100
send +{End}

sleep 100
send ^c ;copy the Search LineValue to Clipboard 
LineValue = %Clipboard%
sleep 100
word_array := StrSplit(LineValue, ",")
sleep 100
SearchValue := word_array[1]" "       ;word_array[2]" "word_array[3]
sleep 100
MsgBox "SearchValue",%SearchValue%
}

F1::ExitApp

以上是关于Autohotkey读取带有百万行的csv文件的主要内容,如果未能解决你的问题,请参考以下文章

访问真正大型csv文件有哪些不同的方法?

熊猫-遍历一百万个单元格

BigQuery 更快地插入数百万行的方法

百万行超大csv如何快速导入mysql

访问非常大的 csv 文件都有哪些不同的方法?

Python Pandas - 读取带有注释标题行的 csv