【问题标题】:Create report and upload to server for download创建报告并上传到服务器以供下载
【发布时间】:2012-01-17 13:54:25
【问题描述】:

我有一个 300MB 的 CSV 文件,有超过 1/2 百万个条目。我想生成报告并让这些报告可供下载。

数据结构如下:

A;B;C;D;E;F;G

当文件按 B 列排序时,我想要创建一个包含前 50 行的单独文件。

【问题讨论】:

  • 1次还是重复这个过程?例如。数据有变化吗? (在 excel 中打开,按 B 列排序,复制第 1 50 行粘贴到工作表 2 中,将工作表 2 保存为第二个报告...
  • 每天重复且必须自动化。

标签: csv


【解决方案1】:

我建议使用Solr 来处理您的数据,它支持indexing of CSV data

Solr 解决了与上传、下载和搜索数据相关的问题。它的性能使得索引可以轻松更新或从头开始重新构建。

示例

安装 Solr

阅读有关如何安装 Solr 的文档。以下是使该演示在 Linux 上运行的“启动”:

wget http://www.apache.org/dist/lucene/solr/3.5.0/apache-solr-3.5.0.tgz
tar zxvf apache-solr-3.5.0.tgz
cd apache-solr-3.5.0/example
java -jar start.jar

以下 URL 上提供的 Solr 管理屏幕

http://localhost:8983/solr/admin/

生成样本数据

编写了一个 groovy 脚本来生成一个示例 CSV 文件。

new File("data.csv").withWriter { writer ->
    writer.println "id;A_s;B_i;C_s;D_s;E_s;F_s"

    for (i in 1..500000) {
        writer.println "${i};${i*10};${i*20};${i*30};${i*40};${i*50};${i*60}"
    }
}

例子

id;A_s;B_i;C_s;D_s;E_s;F_s
1;10;20;30;40;50;60
2;20;40;60;80;100;120
3;30;60;90;120;150;180
4;40;80;120;160;200;240
5;50;100;150;200;250;300
6;60;120;180;240;300;360
7;70;140;210;280;350;420
8;80;160;240;320;400;480
9;90;180;270;360;450;540
..

注意:

我没有对“开箱即用”的 Solr 设置进行任何自定义。这意味着

  • 默认 Solr 配置需要一个唯一的 id 字段
  • 将“_s”附加到列名表示字符串字段。请参阅 Solr 中的 dynamic fields 功能
  • 将 B 列加载为整数 (B_i) 以启用数字排序

有关如何编写自定义架构的详细信息,请参阅Solr Wiki

加载 CSV 文件

Linux curl 命令用于通过执行 HTTP 发布操作来加载 data.csv 文件:

$ curl 'http://localhost:8983/solr/update/csv?separator=;&commit=true' -H 'Content-type:text/plain; charset=utf-8' --data-binary @data.csv

注意:

  • 在大约 90 秒内加载 500,000 行数据
  • 使用separator参数表示数据不被默认“,”分隔
  • 使用 commit 参数表示数据最后提交到索引。

查询数据

以下查询返回按 B 列排序的前 50 行

http://localhost:8983/solr/select/?q=*:*&rows=50&sort=B_i+desc&fl=id,A_s,B_i,C_s,D_s,E_s,F_s&wt=csv

输出为 CSV 格式:

id,A_s,B_i,C_s,D_s,E_s,F_s
500000,5000000,10000000,15000000,20000000,25000000,30000000
499999,4999990,9999980,14999970,19999960,24999950,29999940
499998,4999980,9999960,14999940,19999920,24999900,29999880
499997,4999970,9999940,14999910,19999880,24999850,29999820
499996,4999960,9999920,14999880,19999840,24999800,29999760
..

REST parameters:

  |-------------------------------|------------------------------|
  | Rest parameter                | Description                  |                      
  |-------------------------------|------------------------------|
  | q=*:*                         | Everything.                  |
  | rows=50                       | Number of rows to output     |
  | sort=B_i+desc                 | descending order, sort on B_i|
  | fl=id,A_s,B_i,C_s,D_s,E_s,F_s | columns to include           |
  | wt=csv                        | CSV output                   |
  |-------------------------------|------------------------------|

【讨论】:

    【解决方案2】:

    我今天要做一个衬里,Solr 似乎有点矫枉过正。这是解决您问题的方法(假设没有标题行):

    sort -t\; -k2 < test.csv | head -50
    

    如果您需要第二个字段按数字而不是字母顺序排序,请添加 -n。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多