有个处理 csv 的问题,想了好几个晚上,都没有办法解决,请教各位 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kavana
V2EX    Python

有个处理 csv 的问题,想了好几个晚上,都没有办法解决,请教各位

  •  
  •   kavana 2018-05-10 06:27:54 +08:00 6053 次点击
    这是一个创建于 2763 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有个超过 256 列的 csv 表,大概在 800 多列,10w 行 另外有一张表,要匹配上面这个表中的部分字段,然后找出关键字对应的值,类似于 vlookup 这种功能 现在的情况是,通过 vlookup 也能找,但是花费的时间比较长,放到数据库里,光导入的时间就不是一点半点的 请教一下大家有没有什么好的办法?

    36 条回复    2018-05-12 09:55:47 +08:00
    binux
        1
    binux  
       2018-05-10 06:32:39 +08:00
    你排序了吗?
    madNeal
        2
    madNeal  
       2018-05-10 06:48:10 +08:00
    能不能希望查询的字段抽出来,写到本地 json 文件中,并且保存和 csv 的映射关系,这样找是不是会快一点。
    AX5N
        3
    AX5N  
       2018-05-10 07:23:14 +08:00
    能预处理转换成别的数据结构的话,那倒是有很多办法。不过估计跟直接导入数据库也差不多。
    iceheart
        4
    iceheart/strong>  
       2018-05-10 07:29:42 +08:00 via Android
    把小表读到内存里,对你要匹配的列建索引(就是建几个 map)。然后遍历大表,先匹配你的查找范围,再从小表的索引里查。
    应该用不上多少行代码
    Boyizmen
        5
    Boyizmen  
       2018-05-10 07:38:27 +08:00 via Android
    excel 功能挺强大的不知道转成 excel 格式来处理能不能满足你的需求
    zk123
        6
    zk123  
       2018-05-10 07:38:38 +08:00 via Android
    用 ketttle
    hrong
        7
    hrong  
       2018-05-10 07:51:51 +08:00 via Android
    赞同小表方案。

    另外,找找有没有可以高速探索 csv 的库,游标打开后前后移动的那种,这样从真实 csv 取数据不失性能也比较方便。
    doun
        8
    doun  
       2018-05-10 07:53:30 +08:00 via Android
    10W 行很大?导数据库不是随便折腾吗?或者 power query 了解一下
    liuzhaowei55
        9
    liuzhaowei55  
       2018-05-10 07:54:58 +08:00 via iPhone
    能否确定需要的列?在本地预处理 csv 文件,然后再上传
    df4VW
        10
    df4VW  
       2018-05-10 08:03:49 +08:00
    10w 行导入,考虑到比较长,就算个 2 分钟吧
    McooLewis
        11
    McooLewis  
       2018-05-10 08:06:03 +08:00 via Android
    全倒进数据库不随便折腾?才多少东西啊导入就要好长时间。
    SErHo
        12
    SErHo  
       2018-05-10 08:24:52 +08:00   1
    https://github.com/BurntSushi/xsv 知道有个这个工具,但是没用过,可以看看能不能满足。
    mengzx
        13
    mengzx  
       2018-05-10 08:28:42 +08:00 via Android
    excel 处理这点数据还是没问题的,不需要导入数据库,如果电脑性能差点可以考虑 excel 的 powerquery 处理
    TimePPT
        14
    TimePPT  
    PRO
       2018-05-10 08:36:43 +08:00 via iPhone
    https://github.com/dinedal/textql
    TextQL
    Allows you to easily execute SQL against structured text like CSV or TSV.

    另,Python 的话用 pandas 直接处理 csv 也很方便,就别导入数据库了
    urmyfaith
        15
    urmyfaith  
       2018-05-10 09:00:27 +08:00
    python 貌似很方便
    mmd1989
        16
    mmd1989  
       2018-05-10 09:14:38 +08:00
    10W 行 EXCEL 就搞得定,用 index 配合两个 meach 函数,一定要用 lookup 的话用 lookup 函数,先排序再判断,Vlookup 的效率低很多
    wqzjk393
        17
    wqzjk393  
       2018-05-10 09:14:48 +08:00 via iPhone
    导数据库里吧,csv 比 xslx 这些都快,我导三四百 m 的 csv 到 access 都很快了
    zhucegeqiu
        18
    zhucegeqiu  
       2018-05-10 09:22:29 +08:00
    才 10w 行,用 pandas 吧,pd.read_csv,简单粗暴
    abusizhishen
        19
    abusizhishen  
       2018-05-10 09:26:10 +08:00 via Android
    7 秒导入 200w 行 load data infile 了解一下
    expkzb
        20
    expkzb  
       2018-05-10 09:32:28 +08:00
    用工具将 csv 转成 sqlite 不会花多久的
    super452
        21
    super452  
       2018-05-10 10:05:23 +08:00
    pandas 了解一下?
    ourzhang
        22
    ourzhang  
       2018-05-10 10:38:11 +08:00
    外部表。。。
    kavana
        23
    kavana  
    OP
       2018-05-10 11:42:02 +08:00 via Android
    @mengzx 谢谢啦
    caryqy
        24
    caryqy  
       2018-05-10 14:20:22 +08:00
    awk + grep 呢
    thedrwu
        25
    thedrwu  
       2018-05-10 16:05:11 +08:00 via Android   1
    10w 行的表,awk 如果写得高效,跑起来飞快。
    还能多进程并行!
    在几十个核心的服务器上跑个几秒就解决了。
    Hopetree
        26
    Hopetree  
       2018-05-10 16:18:54 +08:00
    数据的东西交给 pandas
        27
    a132811  
       2018-05-10 16:47:47 +08:00
    才 10w 行,800 列,也没有多少数据嘛。
    简单的匹配 grep, awk。复杂点的匹配,就 python 等处理,很方便的啊。

    刚 python3 写了一个, 10 多行的事情:
    wget https://ahui132.github.io/bin/grepcolumn
    chmod u+x grepcolumn


    echo 'name=Jack,gender=male,job=coder' | grepcolumn - 'job,name'

    echo 'Jack,male,coder' | grepcolumn - 'job,name' -c 'name,gender,job'

    echo 'Jack||male||coder' | grepcolumn - 'job,name' -c 'name,gender,job' -d '||'
    a132811
    annielong
        28
    annielong  
       2018-05-10 16:57:39 +08:00
    看字段内容吧,如果是一般的字段,还是导入数据库方便,我曾处理过一次复杂文本的 csv,字段用逗号隔开,但是某个字段是富文本,里面一大堆换行 和逗号,不知道为什么用 Excel 引擎导入只能处理一部分,最后还是写个软件 处理后批量插入数据库
    a132811
        29
    a132811  
       2018-05-10 17:15:05 +08:00
    csv 的话 pands 最方便:

    dataFrame = pandas.read_csv("./marks.csv", sep=",")
    dataFrame = pandas.read_table("./marks.csv", sep=",")
    zynlp
        30
    zynlp  
       2018-05-10 17:21:37 +08:00 via iPhone
    spss 了解一下?
    zhangsen1992
        31
    zhangsen1992  
       2018-05-10 17:48:02 +08:00
    数据库操作
    Hzzone
        32
    Hzzone  
       2018-05-10 17:51:28 +08:00
    像是中软杯(滑稽)
    LaFayette
        33
    LaFayette  
       2018-05-10 18:12:18 +08:00
    10W 多行不算大,pandas 就可以处理
    lance7in
        34
    lance7in  
       2018-05-11 17:02:12 +08:00 via Android
    @thedrwu 这么好的工具为啥大伙都不用
    guyskk0x0
        35
    guyskk0x0  
       2018-05-11 23:59:05 +08:00 via Android
    试试 apache drill,先把 csv 里需要的字段抽出来
    xiaohanqing
        36
    xiaohanqing  
       2018-05-12 09:55:47 +08:00 via Android
    MySQL,loadCSV,6 百万行也是几分钟的事
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2973 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 14:02 PVG 22:02 LAX 06:02 JFK 09:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86