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 · 5452 次点击
    这是一个创建于 2392 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有个超过 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  
       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  
       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
    a132811
        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 '||'
    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
    像是中软杯(滑稽)
    qianc1990
        33
    qianc1990  
       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   ·   实用小工具   ·   5924 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 02:10 · PVG 10:10 · LAX 18:10 · JFK 21:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.