我有一个大的csv文件要编辑(数万行),任务是编辑它,友好的' anf fast, 所以我想使用PyQt QTableView来保持它,还需要一些过滤器,基本上我需要做一些"更新价格= 200,其中name =' Jack'"操作,
我提出了一些选择,但想知道我们是否可以结合优势
更新:代码在工作站上,无法触摸互联网,我会写 而不是psudo代码,抱歉
1,导入到本地sqlite
它超过一分钟的磁盘和不到10秒的内存,使用QSqlTableModel,它相对较快,并且添加过滤器很容易,输出不会完全显示,直到它& #39;滚动,这很好
# use pyqt and sqlite
fh = open("path/to/csv/file")
query = QSqlQuery()
query.prepare("""insert into table""")
for line in fh:
id, name, price = line.split(",")
query.bindValue()
query.exec()
self.view = QTableView()
self.model = QSqlTableModel()
self.model.setTable(table)
self.view.setModel(self.model)
# some line edit gather pattern input
self.model.setFilter("id = 1003")
2,只是将csv解析为模型并显示,我引用了 pyqt - populating QTableWidget with csv data,回答为user1006989
只是将单元格放入QStandardItem,模型/视图工作正常,但加载大文件太慢(这里约20秒),并且不知道如何实现过滤器(如果我们只是在加载时跳过模型,我怎样才能写回数据)
3,命令行替换
我已经实现了选项1和2,它不是很快但可能是可以接受的,在这里我想知道编写类似Perl的正则表达式替换是否有帮助,(我们需要看到它&#39 ; s原始价值第一)
建议的工作流程是
正则表达式搜索== A>在表/模型中显示/填充== B>接受编辑== C> 准备正则表达式替换
gather pattern with pyqt line edit
grep $pattern large_csv > small_csv
cp small_csv small_csv.bk
populdate small_csv into model and display in table widget
commit change
diff small_csv small_csv.bk and prepare a
perl -ie 's/old_line/new_line' large_csv
提出了一个解决方案,我不必将完整的内容加载到数据库或填充到小部件,这应该更快,同时仍配备过滤器, 但我在== C>
上遇到了一些问题如果过滤器gots 4记录并且我编辑其中一个,只需备份过滤结果然后差异,然后准备整行预备? (每一行都是独一无二的,里面有一些主要的关键内容并且不会发生变化)
希望有人可以复习我的想法或提出一些建议,
非常感谢您的时间:)
答案 0 :(得分:1)
最后我做了第三种方式,但是将文件格式化为较小的结果'也是在python导致它的窗户,
# use regex to simulate grep
# write to a new smaller file
# populate into table widget model
# save changed model back into file
# compare two files, when mismatch found, write the orignal large file once
# but only one line changed, there seems have to be
# m ( orginal lines ) * n ( changed lines ) loop
# accumulate changes until done
速度更快,grep不到1秒,每条更改的线路剩余时间不超过2秒,仍然无法在文件中进行多次替换
这意味着在版本中,如果
# befoer:after
# ... lines not greped
# A > A
# B > B1
# C > C
# D > D1
# E > E1
# ... lines not greped
我必须为B>循环整个大文件B1,即使只有一个匹配,然后D1和E1,应该有一个更复杂的正则表达式替换