[英]PHP reading csv, issue with double quotes
我有一個csv文件,其中包含6行,如下所示:
10264,dan,Dan,37519,MILLER,6/3/2014 14:51,$28.40,Rapid,Dan@Cold.com,,
10443,Dari,"D. R, LLC",37308,SELLERS,6/2/2014 15:12,$40.00,esponse,chards@lobal.net,,
10488,EmHern,"A HOME FOR YOU,LLC",37749,MILLER,6/1/2014 8:23,$33.00, Response,23@YAHOO.COM,,
我試圖讀取該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|Dan@Cold.com
[1] => 10443,Dari,"D. R, LLC",37308,SELLERS,6/2/2014 15:12,$40.00,esponse,chards@lobal.net,,
[2] => 10488,EmHern,"A HOME FOR YOU,LLC",37749,MILLER,6/1/2014 8:23,$33.00, Response,23@YAHOO.COM,,
)
我期望的結果是:
Array
(
[0] => 10264|dan|Dan|$28.40|Dan@Cold.com
[1] => 10443|Dari|"D. R, LLC"|esponse|chards@lobal.net
[2] => 10488|EmHern|"A HOME FOR YOU,LLC"|37749|23@YAHOO.COM
)
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|Dan@Cold.com',
'1' => '10443|Dari|D. R, LLC|$40.00|chards@lobal.net',
'2' => '10488|EmHern|A HOME FOR YOU,LLC|$33.00|23@YAHOO.COM'
)
運行我的代碼給了我
array(
'0' => '10264|dan|Dan|$28.40|Dan@Cold.com',
'1' => '10443|Dari|D. R, LLC|$40.00|chards@lobal.net',
'2' => '10488|EmHern|A HOME FOR YOU,LLC|$33.00|23@YAHOO.COM'
)
這是你的解決方案
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|Dan@Cold.com',
'1' => '10443|Dari|D. R, LLC|$40.00|chards@lobal.net',
'2' => '10488|EmHern|A HOME FOR YOU,LLC|$33.00|23@YAHOO.COM'
)
explination
由於外引號“,getcsv返回單個元素,但是它在“ D”周圍去除了一組引號。 R,LLC”位(女巫給我們提供了類似於第1行的字符串),然后檢查該單個元素,並將其寫入臨時緩沖區((流包裝器)),並使用固定的fgetcsv和voila重新處理該流!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.