2016-11-20 27 views
2

下面是CSV文件:爲什麼fgetcsv()函數將連續的EMPTY字段聚合到一個字段中,並將其放入一個數組位置?

a.csv:

"a","b",,"c",,"d","e","f",,"g","h","i","j",,,,,,,,,,,,,,"k",,,,,,,,,,,,,,,"l","m,n","o" 

現在,在這個CSV文件,,是字段之間的分隔字符。所以第一個字段是a,第二個字段是b,第三個字段是空的,第四個字段是c,第五個字段是空的等等。

這裏是我的示例代碼:

的index.php:

$file = fopen("a.csv", "r"); 

while (!(($line = fgetcsv($file, ',', '"')) === false)) { 
    print_r($line);echo "<br>"; 
} 

預期輸出:

我期待此代碼段打印像:

Array ([0] => a, [1] => b [2] => [3] => c [4] => [5] => d ...so on 

輸出I GOT:

實際輸出我:

Array ([0] => a, [1] => b [2] => ,, [3] => c [4] => ,, [5] => d [6] => , [7] => e [8] => , [9] => f [10] => ,, [11] => g [12] => , [13] => h [14] => , [15] => i [16] => , [17] => j [18] => ,,,,,,,,,,,,,, [19] => k [20] => ,,,,,,,,,,,,,,, [21] => l [22] => , [23] => m,n [24] => , [25] => o [26] =>) 

問題:

  1. 首先,我爲什麼會得到那些隨機逗號?我說隨機,因爲,正如你所看到的,在第一個元素a之後有一個逗號,那麼在第二個元素b之後沒有逗號,並且在c之後沒有逗號(依此類推)。

  2. 對於沒有值的字段,即哪些字段爲空,爲什麼它聚合了好幾個字段,例如, 在索引18所示的字段中,大約14已將EMPTY字段彙總並放入一個陣列位置。爲什麼?這樣做的結果是,這個輸出數組應該包含43元,而現在它包含26

如何解決這些問題,並得到預期的輸出?

注意:我可以更改CSV文件中的分隔符和字段框值。

回答

2

您對fgetcsv有錯誤的參數。 Note the second parameter, length,你錯過了。事實上,就像你剛纔似乎需要默認行爲,這應該工作:

while (!(($line = fgetcsv($file)) === false)) { 

你實際上在做你原來的代碼設置CSV線長度「」分隔符爲雙報價,而不是設置機箱,這意味着它也默認爲雙引號。這顯然使解析器混亂。 (順便說一下,在使用它之前,你可能還想確保文件存在,否則當fgetcsv返回NULL時,你的代碼將進入無限循環。)

相關問題