将 CSV 合并为一个文件,大小呈指数级增长
Merging CSVs into one sees exponentially bigger size
我有 600 个大小为 ~1Mo 的 CSV 文件,总共大约 600Mo。我想将它们全部放入 sqlite3 数据库中。所以我的第一步是将它们合并成一个大的 csv( of ~600Mo right?),然后再将其导入 sql db.
然而,当我运行以下bash命令(合并所有文件并保留一个文件头)时:
cat file-chunk0001.csv | head -n1 > file.csv
for f in *.csv; do cat "`pwd`/$f" | tail -n +2 >> file.csv; done
结果 file.csv 的大小为 38Go,此时进程停止,因为我的设备上没有 space。
所以我的问题是:为什么合并后的文件大小会比预期大 50 倍以上?我该怎么做才能将它们放入合理大小的 sqlite3 数据库中?
我想我的第一个问题是:如果您知道如何执行 for 循环,为什么需要将所有文件合并到一个 CSV 文件中?不能一个接一个加载吗?
但是你的问题是一个死循环。您的通配符 (*.csv
) 包含 您要写入的文件。您可以将输出文件放在不同的目录中,或者确保您的文件 glob 不包含输出文件(可能 for f in file-*.csv
)。
我有 600 个大小为 ~1Mo 的 CSV 文件,总共大约 600Mo。我想将它们全部放入 sqlite3 数据库中。所以我的第一步是将它们合并成一个大的 csv( of ~600Mo right?),然后再将其导入 sql db.
然而,当我运行以下bash命令(合并所有文件并保留一个文件头)时:
cat file-chunk0001.csv | head -n1 > file.csv
for f in *.csv; do cat "`pwd`/$f" | tail -n +2 >> file.csv; done
结果 file.csv 的大小为 38Go,此时进程停止,因为我的设备上没有 space。
所以我的问题是:为什么合并后的文件大小会比预期大 50 倍以上?我该怎么做才能将它们放入合理大小的 sqlite3 数据库中?
我想我的第一个问题是:如果您知道如何执行 for 循环,为什么需要将所有文件合并到一个 CSV 文件中?不能一个接一个加载吗?
但是你的问题是一个死循环。您的通配符 (*.csv
) 包含 您要写入的文件。您可以将输出文件放在不同的目录中,或者确保您的文件 glob 不包含输出文件(可能 for f in file-*.csv
)。