如何从 .csv 输出样本行?

如何从 .csv 输出样本行?

我正在进行大量数据合并打印,并且希望能够从大型数据库中输出(例如)10 个样本。我的目标是从提供的 .csv(包括第一行和最后一行)中提取均匀分布的 10 行,并将其输出为新的 .csv 文件。

答案1

此答案假设您的 csv 文件每行一行,这意味着没有连续的行。如果文件名为db.csv,那么您可以使用以下命令获取 10 行,包括第一行和最后一行:

awk 'FNR==NR{next} FNR==1{n=NR-1} FNR>x || FNR==n{x+=n/9;print}' db.csv db.csv

怎么运行的

由于 csv 文件在命令行上列出了两次,awk因此将读取它两次。第一个用于获取总行数。第二次用于打印选定的 10 行。

  • FNR==NR{next}

    NR是迄今为止读取的记录(行)总数。文件记录号FNR等于迄今为止从此文件读取的记录(行)总数。所以,当 时FNR==NR,我们仍在读取第一个文件。如果是这样,我们就跳到next记录。

  • FNR==1{n=NR-1}

    如果我们到达此命令,则意味着我们位于第二次通读的第一行。在这种情况下,我们知道文件中的记录总数为NR-1。我们将此数字保存为n.

  • FNR>x || FNR==n{x+=n/9;print}

    通读第二行的第一行,FNR==1并且x=0。因此,FNR>x我们打印该行。然后我们递增xn/9在下一次打印一行,FNR>x依此类推。

    该条件FNR==n确保打印文件中的最后一行。

例子

让我们创建一个包含 101 行的文件:

$ seq 101 >db.csv

现在,我们可以使用awk命令打印文件中的 10 行,包括第一行和最后一行:

$ awk 'FNR==NR{next} FNR==1{n=NR-1} FNR>x || FNR==n{x+=n/9;print}' db.csv db.csv
1
12
23
34
45
57
68
79
90
101

答案2

尝试以下操作

SELECT your_column1, your_column2
FROM your_table_name
INTO OUTFILE '/tmp/ouput.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

这适用于 Windows 上的 Linux 替换

INTO OUTFILE '/tmp/output.csv'

INTO OUTFILE 'c:\output.csv'

答案3

如果您的 CSV 文件不受限制并且在字段值中包含换行符和逗号,您应该使用真正的 CSV 解析库,例如 python 中的一个可用标准:

import csv

def select_evenly(file_name, nr):
    rows = []
    with open(file_name) as fp:
        for row in csv.reader(fp):
            rows.append(row)
    nr_rows = len(rows)
    step = (nr_rows - 2.0) / (nr - 1)
    yield rows[0]
    for x in range(1, nr-1):
        yield rows[int(x * step + 0.5)]
    yield rows[-1]

for line in select_evenly("test.csv", 10):
    print line

相关内容