2017-08-03 14 views
1

私はcsvファイルにいくつかのデータを入力しようとしていますが、うまく機能しますが、データのテーブルのヘッダーを追加しようとすると、 「file.csvのファイル形式と拡張子が一致していないため、ファイルが破損している可能性があります。fputcsv phpを使用してcsvに見出しを追加

は、ここでは、コードです:

//crate headers 
$headers[] = "ID"; 
$headers[] = "Name"; 
$headers[] = "Ref"; 
$headers[] = "Quantity"; 

// crete and open file 
$csvName = "file.csv"; 
$fileHandle = fopen($csvName, 'w') or die('Can\'t create .csv file, try again later.'); 

//Add the headers, if I take this line out the excel allows me to open the file 
fputcsv($fileHandle,$headers,";"); 

//Add the data 
for($i = 0; $i < count($info); ++$i) { 
    fputcsv($fileHandle,$info[$i],";"); 
} 

//close file 
fclose($fileHandle); 

編集:ここでは

は、メモ帳で開いている私のCSVファイルの最初の行です:

IDは、名前;参考;数量

2。 "ブラウス - 色:白、サイズ:M"; demo_2; 6

3; "プリントドレス - 色:オレンジ、サイズ:S "; demo_3; 4

+2

あなたがシングルクォートやダブルクォートを使用している方法は私を精神的に傷つけます。 [補間](https://en.wikipedia.org/wiki/String_interpolation)を必要としないものについては一重引用符を使用し、それ以外のものについては二重引用符を使用する必要があります。基本的に、二重引用符はすべてあなたのコードに一重引用符でなければなりません – GrumpyCrouton

+0

csvファイル出力をテキストエディタで開き、その内容を私たちと共有できますか?多分最初の3-4行が必要です。 – GrumpyCrouton

+0

はい、私はもともと一重引用符を使用していましたが、単引用符を二重引用符に変更して何らかの理由で機能するかどうかを確認しましたが、それを元に戻すのを忘れました。 – Sefean

答えて

1

は、Excelで正常に開くことができるCSVファイルを作成するためにこれを使用することを意図している場合、彼らは含まれていないので、ヘッダは、二重引用符(に包まする必要はありませんセパレータ文字はセミコロンではなくコンマを使用する必要があります。ただし、これらの変更を行った場合、は、Excelで結果ファイルを開こうとすると、同じエラーメッセージが表示されます。驚いたことに、これはbecause your headers start with 'ID'です。

最初の列ヘッダーに別の名前を使用できれば、少し単純化できます。

$headers = ["ItemID", "Name", "Ref", "Quantity"]; 

$csvName = "file.csv"; 
$fileHandle = fopen($csvName, 'w') or die('Can\'t create .csv file, try again later.'); 

//Add the headers 
fputcsv($fileHandle, $headers); 

//Add the data 
foreach ($info as $item) { 
    fputcsv($fileHandle, $item); 
} 

//close file 
fclose($fileHandle); 

これは、エラーなしでExcelで開く.csvファイルを作成するはずです。

+0

WOW!私はそれが原因であるとは想像もできなかったかもしれませんが、今は完璧に働いています、ありがとう! – Sefean

+1

うん!かなり変だ。そのブログ記事は、偶然にもここのモデレーターの一人の礼儀であるようです。 –

1

これにあなたのヘッダーを変更してください:

$headers[] = '"ID"'; 
$headers[] = '"Name"'; 
$headers[] = '"Ref"'; 
$headers[] = '"Quantity"'; 

これは、あなたが経験している構文の問題を修正する必要のある、二重引用符内の文字列をラップします。

+0

fputcsvは、文字列の引用符のために余分な引用符を追加します。 – manassehkatz

+0

@manassehkatz彼の出力は文字列のまわりに引用符がありません – GrumpyCrouton

+0

私はPHPでそれをテストし、取得しました: "" "" "" "" "" "" "" "" Ref "" "" "" Quantity "" "' ' – manassehkatz

0

Excelは厄介です。 PHPはデフォルトでカンマを使用していますが、これは実際にExcel用に使用するものです。セミコロンは、しばしば動作しますが、デフォルトではありません.CSVは、の略で、カンマの値を表します。 2番目の問題はExcel固有の問題です。何らかの理由でデータセクションで引用符のない文字列を処理しても、ヘッダー行ではうまく動作しません。 fputcsvに引用符を付けるオプションがないので、それらをハードコードする必要があります。ような何か:

// create and open file 
$csvName = "file.csv"; 
$fileHandle = fopen($csvName, 'w') or die("Can't create .csv file, try again later."); 

//Add the headers - note that \r\n or \n is OS dependent 
fwrite($fileHandle,'"ID","Name","Ref","Quantity"' . "\r\n"); 

//Add the data 
for ($i = 0; $i < count($info); ++$i) { 
    fputcsv($fileHandle,$info[$i]); 
} 

//close file 
fclose($fileHandle); 
+0

このようなもの、それはエクセルfoが唯一の1セルにヘッダを置く、私はこれを試してみました、それが動作しませんでした: (で区切られた各列「 - 」) ID;名;参考;数量 2 - NameWhatever - demo_1 - 2 3 - NameWhatever - demo_1 - 2 – Sefean

+0

セミコロンの代わりにコンマ(デフォルト)を使用するようにデータfputcsvを変更しましたか?あなたがしなかった場合、Excelは混乱してしまいます。私はそれを試してみましたが、ヘッダーのOKとデータはすべて1行に1セルでした。 – manassehkatz

+0

はい、すべてをカンマに変更すると、最初の列にのみ書き込まれます.Excelはコンマではなくセミコロンを使用するためです。 – Sefean

関連する問題