我有一个csv文件,其中包含6行,如下所示:
10264,dan,Dan,37519,MILLER,6/3/2014 14:51,$28.40,Rapid,[email protected],,
10443,Dari,"D. R, LLC",37308,SELLERS,6/2/2014 15:12,$40.00,esponse,[email protected],,
10488,EmHern,"A HOME FOR YOU,LLC",37749,MILLER,6/1/2014 8:23,$33.00, Response,[email protected],,
我试图读取该csv并提取一些列,然后向提取的每个列添加管道定界符,这是我使用的功能:
<?php
function fncReadCSV($csvFileName){
$result = array();
$row = 1;
if (($handle = fopen($csvFileName, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$outPut = "";
$outPut .= $data[0];
$outPut .="|";
$outPut .= $data[1];
$outPut .="|";
$outPut .= $data[2];
$outPut .="|";
$outPut .= $data[6];
$outPut .="|";
$outPut .= $data[8];
$outPut .="|";
array_push($result, rtrim($outPut, "|"));
$row++;
}
}
fclose($handle);
return $result;
}
echo "<pre>";
print_r(fncReadCSV("file.csv"));
echo "</pre>";
我得到的结果仅对第一行是正确的,对于第二,第三行,我得到的是csv中的完整行,我期望引号会破坏我的代码,如何使用有效的代码解决该问题对于带引号的csv文件和没有请的csv文件?
结果是:
Array
(
[0] => 10264|dan|Dan|$28.40|[email protected]
[1] => 10443,Dari,"D. R, LLC",37308,SELLERS,6/2/2014 15:12,$40.00,esponse,[email protected],,
[2] => 10488,EmHern,"A HOME FOR YOU,LLC",37749,MILLER,6/1/2014 8:23,$33.00, Response,[email protected],,
)
我期望的结果是:
Array
(
[0] => 10264|dan|Dan|$28.40|[email protected]
[1] => 10443|Dari|"D. R, LLC"|esponse|[email protected]
[2] => 10488|EmHern|"A HOME FOR YOU,LLC"|37749|[email protected]
)
fgetcsv()应该处理单引号,事实上fputcsv()的默认输出是引用(换行)其中带有空格的任何行。完全希望用定界符在字符串周围包含“”,即“单词,其他单词”,这对于fgetscsv可以100%罚款。
尝试这个
echo '<pre>';
if (($handle = fopen($csvFileName, "r")) !== FALSE) {
while (false !== ($data = fgetcsv($handle, 1024))) {
print_r($data);
$data_row = array(
$data[0],
$data[1],
$data[2],
$data[6],
$data[8]
);
$result[] = implode("|", $data_row);
$row++;
}
}
fclose($handle);
return $result;
内爆比较干净,您将不需要修剪多余的“ |” ?,因为无论如何我都没看到目的,为什么不省略最后一个(最右边)|。
$outPut .="|";
array_push($result, rtrim($outPut, "|"));
array_push($result, $outPut));
实际上,运行您的确切代码会为我提供此输出?
$result = array();
$row = 1;
if (($handle = fopen(__DIR__.'/test.csv', "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$outPut = "";
$outPut .= $data[0];
$outPut .="|";
$outPut .= $data[1];
$outPut .="|";
$outPut .= $data[2];
$outPut .="|";
$outPut .= $data[6];
$outPut .="|";
$outPut .= $data[8];
$outPut .="|";
array_push($result, rtrim($outPut, "|"));
$row++;
}
}
fclose($handle);
array(
'0' => '10264|dan|Dan|$28.40|[email protected]',
'1' => '10443|Dari|D. R, LLC|$40.00|[email protected]',
'2' => '10488|EmHern|A HOME FOR YOU,LLC|$33.00|[email protected]'
)
运行我的代码给了我
array(
'0' => '10264|dan|Dan|$28.40|[email protected]',
'1' => '10443|Dari|D. R, LLC|$40.00|[email protected]',
'2' => '10488|EmHern|A HOME FOR YOU,LLC|$33.00|[email protected]'
)
这是你的解决方案
echo "<pre>";
$result = array();
$row = 1;
if (($handle = fopen(__DIR__.'/test.csv', "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if(count($data) == 1){
$f = fopen('php://temp', 'w');
fwrite($f, $data[0]);
rewind($f);
$data = fgetcsv($f, 1000, ",");
fclose($f);
}
$data_row = array(
$data[0],
$data[1],
$data[2],
$data[6],
$data[8]
);
$result[] = implode("|", $data_row);
$row++;
}
}
var_export($result);
fclose($handle);
输出
array(
'0' => '10264|dan|Dan|$28.40|[email protected]',
'1' => '10443|Dari|D. R, LLC|$40.00|[email protected]',
'2' => '10488|EmHern|A HOME FOR YOU,LLC|$33.00|[email protected]'
)
爆炸
由于外引号“,getcsv返回单个元素,但是它在“ D”周围去除了一组引号。R,LLC”位(女巫给我们提供了与第1行类似的字符串),然后检查该单个元素,并将其写入临时缓冲区((流包装器)),并使用固定的fgetcsv和voila重新处理该流!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句