【问题标题】:Choice of script language for processing and transposing csv data [closed]选择用于处理和转置 csv 数据的脚本语言 [关闭]
【发布时间】:2016-05-31 07:17:16
【问题描述】:

我得到了一个SQL表中的一些数据,需要按照一些规则进行转换。 但是,这种转换需要动态寻址列名,即应该存储值的列名本身作为值存储在其他列中,等等。 此外,根据值是否存在于不同列的范围内,应该为单个输入行生成多个输出行,所以我猜这是一种转置。

让我用一个例子来说明它:

id | targetColumnName | col1 | col2 | col3 | col4
-----------------------------------------------------
 1                foo             5
 2                foo      7            42
 3                bar             3             6
 4                foo                    5
 5                bar
 6                bar                    2     12

这应该产生以下内容:

id | foo | bar
--------------
 1     5
 2     7
 2    42
 3           3
 3           6
 4     5
 6           2
 6          12

换句话说,对于任何 colX 列中的每个当前值,在由 targetColumnName 列指定的列中生成具有该值的输出行。

这让我相信使用 SQL 根本不是一个好主意,至少不是通过创建一个简单的查询。可能可以创建一个复合语句/存储过程,但对我来说仍然是适合这项工作的错误工具。

我也有 csv 格式的数据,我觉得具有文本操作功能的强大脚本语言更适合这项工作,但我只接触了 Python 的皮毛,我不懂任何 Perl 和只有一点 awk 等。 我知道我可以在 Java 中实现它,但我仍然觉得这可以通过 Python 中的一个神奇的单线来完成。 :)

所以问题本质上是 1) 使用 SQL(ite) 执行此操作是否合理,以及 2) 还有什么其他工具会更好?

【问题讨论】:

  • 这不是一个好问题。每个人都可以以不同的方式回答,我更喜欢存储过程的方法,其他人会编写一个 java 应用程序。对于这样的问题,你无法得到明确的答案。
  • 我不是在要求 java 解决方案,我可以自己做。我意识到询问哪种语言做得最好可能会变得固执己见,但我不是简单地问“哪种语言最好”,而是问哪种语言具有适合这种类型的内置功能处理。

标签: python sqlite csv awk data-processing


【解决方案1】:

虽然不完全是单行,但这在 Python (*) 中相对容易。标准库中的csv 模块是你的朋友。

假设目标列名未知并且文件太大而无法读入内存,您必须读取 CSV 一次以获取所有可能的列名,然后再进行第二次进行实际转换。

这是一些伪代码:

import csv

fieldnames = set('id')
with open('in.csv', 'rb') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        fieldname = row[1]
        fieldnames.add(row[1])
fieldnames = sorted(fieldnames)

with open('in.csv', 'rb') as csvfile:
    reader = csv.reader(csvfile)
    with open('out.csv', 'w') as outfile:
        writer = csv.DictWriter(outfile, fieldnames=fieldnames)
        for row in reader:
            id_ = row[0]
            fieldname = row[1]
            for field in row[2:]:
                if field:
                    writer.writerow({'id': id_, fieldname: field})

您可能需要根据 CSV 的方言将一些参数调整为 csv.reader

(*) 17 个非空行 :)

【讨论】:

  • 这看起来很有希望,我会试一试。谢谢!
猜你喜欢
  • 2011-08-17
  • 2011-12-17
  • 2010-09-24
  • 1970-01-01
  • 2011-03-12
  • 2011-02-19
  • 2010-11-05
  • 2011-02-09
  • 2023-03-31
相关资源
最近更新 更多