作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
需要使用 php 和 linux 将大型 csv 文件分成多个文件。
CSV 包含 -
"id","name","address"
"1","abc","this is test address1 which having multiple newline
separators."
"2","abc","this is test address2
which having multiple newline separators"
"3","abc","this is test address3.
which having multiple
newline separators."
我使用了 linux 命令 - split -l 5000 测试文件。
但它无法以正确的格式拆分 csv,因为在 csv 中有一个字段地址具有多个换行符,因此命令从该行拆分文件。
我也尝试过使用 PHP:
$inputFile = 'filename.csv';
$outputFile = "outputfile";
$splitSize = 5000;
$in = fopen($inputFile, 'r'):
$header = fgetcsv($in);
$rowCount = 0;
$fileCount = 1;
while (!feof($in)) {
if (($rowCount % $splitSize) == 0) {
if ($rowCount > 0) {
fclose($out);
}
$filename = $outputFile . $fileCount++;
$out = fopen($filename .'.csv', 'w');
chmod($filename,777);
fputcsv($out, $header);
}
$data = fgetcsv($in);
if ($data) {
fputcsv($out, $data);
$rowCount++;
}
}
fclose($out);
如何解决这个问题?
最佳答案
使用 ruby :
ruby -e 'require "csv"
f = ARGV.shift
CSV.foreach(f).with_index{ |e, i|
File.write("#{f}.#{i}", CSV.generate_line(e, force_quotes: true))
}' file.csv
PHP:
<?php
$inputFile = 'file.csv';
$outputFile = 'file.out';
$splitSize = 1;
if (($in = fopen($inputFile, 'r'))) {
$header = fgetcsv($in);
$rowCount = 0;
$fileCount = 0;
while (($data = fgetcsv($in))) {
if (($rowCount % $splitSize) == 0) {
if ($rowCount > 0) {
fclose($out);
}
$filename = $outputFile . ++$fileCount . '.csv';
$out = fopen($filename, 'w');
chmod($filename, 755);
fputcsv($out, $header);
}
fputcsv($out, $data);
$rowCount++;
}
fclose($out);
}
?>
关于linux - 如何使用 linux 将大型 csv 拆分为多个小型 csv?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25241018/
我是一名优秀的程序员,十分优秀!