首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动热键读取百万行csv文件

自动热键读取百万行csv文件
EN

Stack Overflow用户
提问于 2017-12-16 08:58:28
回答 2查看 1.3K关注 0票数 0

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

示例CSV文件:

代码语言:javascript
复制
Rob,school,oxford,tennis
James,school,cambridge,cricket
lucy,college,harvard,football
lily,hotel,novotel,golf
..
..
..
1 million lines.

要求:

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

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

我写的脚本:

代码语言:javascript
复制
#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%

请帮助我改进我的脚本的性能.

EN

回答 2

Stack Overflow用户

发布于 2017-12-18 15:31:17

如果使用RAMDISK,可以加快搜索结果。我看不出您的tf.ahk脚本是什么,但是5-10分钟是长的,1-- tf.ahk文件中的循环代码不是很好的2--或者每次从HardDisk c:而不是从您的内存中搜索时,它都会执行搜索。

您可以从这里下载免费软件输入盘

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

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

z:\example.csv

代码语言:javascript
复制
Rob,school,oxford,tennis
James,school,cambridge,cricket
lucy,college,harvard,football
lily,hotel,novotel,golf
..
..
..
1 million lines.

注意:使用这个AHK键盘快捷宏脚本,您可以输入--例如:学院、哈佛大学,然后在NotePad中进行搜索,并给出结果值(这只是一个测试它的示例,对于更大的文件,您需要对代码进行一点尝试,并使用能够处理更大文件的其他应用程序(SpeadSheat程序))。

Search.ahk

代码语言:javascript
复制
; 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
票数 0
EN

Stack Overflow用户

发布于 2017-12-19 23:51:57

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

代码语言:javascript
复制
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()
}

参见:文件对象的手动输入

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47844080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档