推荐学习书目
› 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 · May 10, 2018 · 6973 views
    This topic created in 3100 days ago, the information mentioned may be changed or developed.

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

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

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

    另,Python 的话用 pandas 直接处理 csv 也很方便,就别导入数据库了
    urmyfaith
    urmyfaith
    May 10, 2018
    15
    python 貌似很方便
    mmd1989
    mmd1989
    May 10, 2018
    16
    10W 行 EXCEL 就搞得定,用 index 配合两个 meach 函数,一定要用 lookup 的话用 lookup 函数,先排序再判断,Vlookup 的效率低很多
    wqzjk393
    wqzjk393
    May 10, 2018 via iPhone
    17
    导数据库里吧,csv 比 xslx 这些都快,我导三四百 m 的 csv 到 access 都很快了
    Vanquish5419
    Vanquish5419
    May 10, 2018
    18
    才 10w 行,用 pandas 吧,pd.read_csv,简单粗暴
    abusizhishen
    abusizhishen
    May 10, 2018 via Android
    19
    7 秒导入 200w 行 load data infile 了解一下
    expkzb
    expkzb
    May 10, 2018
    20
    用工具将 csv 转成 sqlite 不会花多久的
    super452
    super452
    May 10, 2018
    21
    pandas 了解一下?
    ourzhang
    ourzhang
    May 10, 2018
    22
    外部表。。。
    kavana
    kavana
    OP
    May 10, 2018 via Android
    23
    @mengzx 谢谢啦
    caryqy
    caryqy
    May 10, 2018
    24
    awk + grep 呢
    thedrwu
    thedrwu
    May 10, 2018 via Android❤️1
    25
    10w 行的表,awk 如果写得高效,跑起来飞快。
    还能多进程并行!
    在几十个核心的服务器上跑个几秒就解决了。
    Hopetree
    Hopetree
    May 10, 2018
    26
    数据的东西交给 pandas
    a132811
    a132811
    May 10, 2018
    27
    才 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
    annielong
    May 10, 2018
    28
    看字段内容吧,如果是一般的字段,还是导入数据库方便,我曾处理过一次复杂文本的 csv,字段用逗号隔开,但是某个字段是富文本,里面一大堆换行 和逗号,不知道为什么用 Excel 引擎导入只能处理一部分,最后还是写个软件 处理后批量插入数据库
    a132811
    a132811
    May 10, 2018
    29
    csv 的话 pands 最方便:

    dataFrame = pandas.read_csv("./marks.csv", sep=",")
    dataFrame = pandas.read_table("./marks.csv", sep=",")
    zynlp
    zynlp
    May 10, 2018 via iPhone
    30
    spss 了解一下?
    zhangsen1992
    zhangsen1992
    May 10, 2018
    31
    数据库操作
    Hzzone
    Hzzone
    May 10, 2018
    32
    像是中软杯(滑稽)
    LaFayette
    LaFayette
    May 10, 2018
    33
    10W 多行不算大,pandas 就可以处理
    lance7in
    lance7in
    May 11, 2018 via Android
    34
    @thedrwu 这么好的工具为啥大伙都不用
    guyskk0x0
    guyskk0x0
    May 11, 2018 via Android
    35
    试试 apache drill,先把 csv 里需要的字段抽出来
    xiaohanqing
    xiaohanqing
    May 12, 2018 via Android
    36
    MySQL,loadCSV,6 百万行也是几分钟的事
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1311 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 87ms · UTC 20:03 · PVG 04:03 · LAX 12:03 · JFK 15:03
    ♥ Do have faith in what you're doing.