2013-07-15 45 views
-3

我告訴你這個函數「fputcsv」是越野車! 我爲什麼這麼說? 我創建了一個CSV文件說,4號線PHP csv函數fputcsv

l1data1;l1data2;l1data3;l1data4 
l2data1;l2data2;l2data3;l2data4 
l3data1;l3data2;l3data3;l3data4 
l4data1;l4data2;l4data3;l4data4 

確定現在我簡單的複製該文件到另一個文件中使用fgetcsv和fputcsv像下面這樣:

$handle = fopen($nameFile, "r") or die("Cannot open file: ".$nameFile); 
$temporaryFile = fopen($nameTempFile, "w") or die("Cannot open file: ".$nameTempFile); 
while (($data = fgetcsv($handle,"", ";")) !== false) { 
    fputcsv($temporaryFile, $data,";"); 
} 
fclose($temporaryFile); 
fclose($handle); 

輸出文件:

l1data1;l1data2;l1data3;l1data4 
l2data1;l2data2;"l2data3";l2data4 
l3data1;l3data2;"l3data3";l3data4 
l4data1;l4data2;"l4data3";l4data4 

由於某些原因,我的第三列中沒有明顯的原因,因此會出現雙引號。

現在我有一些舊的方式做到這一點:

while ($data=fgets($handle)){ 
    fputs($temporaryFile, $data); 
} 

輸出類似預期:

l1data1;l1data2;l1data3;l1data4 
l2data1;l2data2;l2data3;l2data4 
l3data1;l3data2;l3data3;l3data4 
l4data1;l4data2;l4data3;l4data4 

解釋這個!

編輯:

CodeOffreArtemis;CodeOffre42C;CodeOffreSagic;ServiceType;Rate;TypeInterface;Techno;Libelles;CodeOffreCristal 
G8R1_ACAB;ABE;;ACA;18;Eth;A;ACo Max2;test 
G8R1_ACAC;ABE;ACABUS;ACA;18;Eth;A;ACo 20MMax; 
G8R1_ACAD;AKE;ACAD;ACA;2MMAX;Eth;A;ACo 2MMax; 
G8R1_ACANBA;WAB;;ACA;18;Eth;A;DSL Access Max2 ACA Nu ligne active;X201 
G8R1_ACANBC;WAB;;ACA;18;Eth;A;DSL Access Max2 ACA Nu sur pré-câblée;X201 
G8R1_ACANBI;WAB;;ACA;18;Eth;A;DSL Access Max2 ACA Nu ligne inactive;X201 
G8R1_ACANBPORA;QAB;;ACA;18;Eth;A;DSL Access Max2 ACA Nu avec portabilité L active;X201 
G8R1_ACANBR;WAB;;ACA;18;Eth;A;DSL Access Max2 ACA Nu Nd de routage;X201 
G8R1_ACANCA;WAB;ACANB;ACA;18;Eth;A;DSL Access 20MMax ACA Nu ligne active;X201 

第一行是標題其餘的數據。

+0

雙引號值在標準中,不應導致任何問題。這是奇怪的,但它爲什麼會這樣做... –

+0

輸出文件1的第一行是否缺少雙引號,或者是一個錯字? –

+0

我無法複製所得到的結果(使用PHP 5.3.24) - 嘗試使用'var_dump'輸出您正在從文件中讀取的字符,也許? – andrewsi

回答

0
fgetcsv($handle,"", ";"); 

看這裏: http://www.php.net/manual/en/function.fgetcsv.php

array fgetcsv (resource $handle [, int $length = 0 [, string $delimiter = ',' [, string $enclosure = '"' [, string $escape = '\\' ]]]]) 

關於該長度參數:

必須大於最長行更大的(以字符)在CSV文件中找到(允許尾行尾字符)。它在PHP 5中成爲可選項。省略此參數(或者在PHP 5.0.4及更高版本中將其設置爲0),最大行長度不受限制,這稍微慢一些。

我無法確定,但它看起來像你只是省略了句柄,根據版本可能是合法的,但似乎也可能是模棱兩可的?嘗試在那裏添加一個0參數?

+0

我把它放在1000上了,我仍然得到了相同的結果 – Joseph

+0

好的,這些參數對我來說雖然沒有意義。是「」應該是你的長度參數?或者它是分隔符和「;」外殼?它看起來像錯誤的順序。我想知道這是否會導致一些奇怪的行爲,因爲它被解釋的方式。 另外,你使用的是什麼版本的PHP和操作系統?在5.4.x之前有一個magic_quotes_runtime變量可以影響fputcsv(),即使使用引號字符進行轉義取決於配置。令人懷疑的是這個問題,但如果沒有其他的工作... –

+0

Andrewsi給了我所有我需要的信息,這是fputcsv它的缺陷,只要你有空間,它會自動添加雙引號。它不應該。 – Joseph