在python / pyqt

时间:2015-12-10 15:03:34

标签: python regex csv pyqt large-files

我有一个大的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记录并且我编辑其中一个,只需备份过滤结果然后差异,然后准备整行预备? (每一行都是独一无二的,里面有一些主要的关键内容并且不会发生变化)

希望有人可以复习我的想法或提出一些建议,

非常感谢您的时间:)

1 个答案:

答案 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,应该有一个更复杂的正则表达式替换