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

时间:2017-12-16 08:58:28

标签: scripting autohotkey

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

示例CSV文件:

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

要求:

当我调用 AHK 脚本时,它会通过输入框提示用户输入,并将输入作为詹姆斯学校输入,并输出为剑桥即可。同样输入百合酒店,它应输出为 novotel

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

我写的脚本:

#SingleInstance, force
#Include C:\Users\mpechett\Desktop\ahk\tf.ahk

InputBox, Name, Search for Name


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

pattern = %word_array1%,%word_array2%


Outputline = % TF_Find("C:\Users\mpechett\example.csv", "","", pattern, 1, 1)


MsgBox,%Outputline%

请帮助我提高脚本的效果。

2 个答案:

答案 0 :(得分:0)

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

您可以从此处下载免费软件Imdisk

  • RAMDISK是一个虚拟硬盘,放在你的Ram内存中。

  • RAMDISK比硬盘快+ 100倍。

首先在Windows系统上安装IMDISK,然后您可以简单地安装/放置/复制任何应用程序或将任何 csv文件放入/复制到Ramdisk [示例 - 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中进行搜索,它将给出结果值 football (这只是一个测试它的示例,对于更大的文件,您需要稍微查看代码并使用可以处理更大文件的其他应用程序(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

答案 1 :(得分:0)

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

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

的手动输入