teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

`fputcsv\(\)` 起因や BOM 起因

2017/07/26 05:53

投稿

think49
think49

スコア18194

answer CHANGED
@@ -56,7 +56,7 @@
56
56
  ,"Cell-3A","Cell-3B"
57
57
  ```
58
58
 
59
- ならば、`fputcsv()` や BOM 起因疑う余地はありません。
59
+ ならば、`fputcsv()` 起因や BOM 起因疑う余地はありません。
60
60
 
61
61
  ```PHP
62
62
  fputcsv($buf, $titles); // ここまでは期待通りに動作している

3

\$valuess\[0\]\[0\]

2017/07/26 05:53

投稿

think49
think49

スコア18194

answer CHANGED
@@ -67,7 +67,7 @@
67
67
  }
68
68
  ```
69
69
 
70
- 疑うべきは変数 `$valuess` の値であり、1列目が空欄になっていると思われます。
70
+ 疑うべきは変数 `$valuess` の値であり、`$valuess[0][0]` が空欄になっていると思われます。
71
71
  `var_dump()` で値を確認して下さい。
72
72
 
73
73
  ```PHP

2

2行目以降の1列目が空欄になる

2017/07/26 05:50

投稿

think49
think49

スコア18194

answer CHANGED
@@ -41,4 +41,39 @@
41
41
 
42
42
  - [CSVファイルの一般的書式 (RFC4180 日本語訳) - アルプス登山の玄関口・笠井家](http://www.kasai.fm/wiki/rfc4180jp)
43
43
 
44
+ ### 2行目以降の1列目が空欄になる
45
+
46
+ > 1行目の1列目以外のすべての1列目が空欄になります。
47
+ > 1行目の1列目に「項目名」が挿入され、それがずれていることはありません。
48
+
49
+ 上記の通り、現象を再確認しました。
50
+ CSVデータは下記のようになっていると思われます。
51
+
52
+ ```
53
+ "項目A","項目B"
54
+ ,"Cell-1A","Cell-1B"
55
+ ,"Cell-2A","Cell-2B"
56
+ ,"Cell-3A","Cell-3B"
57
+ ```
58
+
59
+ ならば、`fputcsv()` や BOM 起因と疑う余地はありません。
60
+
61
+ ```PHP
62
+ fputcsv($buf, $titles); // ここまでは期待通りに動作している
63
+ foreach ($ids as $id) {
64
+ if (isset($valuess[$id])) {
65
+ fputcsv($buf, $valuess[$id]); // ここで1列目に入るべきデータが2列目にずれて挿入される
66
+ }
67
+ }
68
+ ```
69
+
70
+ 疑うべきは変数 `$valuess` の値であり、1列目が空欄になっていると思われます。
71
+ `var_dump()` で値を確認して下さい。
72
+
73
+ ```PHP
74
+ var_dump($valuess);
75
+ ```
76
+
77
+ そして、変数 `$valuess` を生成しているコードを見直して下さい。
78
+
44
79
  Re: YYama さん

1

1行目?1列目?

2017/07/26 05:44

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,3 +1,5 @@
1
+ ### 1行目が空欄
2
+
1
3
  > csvをDLしようとする際、必ず出力されるCSVの第一行目が空になってしまいます。
2
4
  > 具体的には、1列目に入るべき値が2列目に入ってしまっています。
3
5
 
@@ -13,4 +15,30 @@
13
15
 
14
16
  - [PHP: file_put_contents - Manual](http://php.net/manual/ja/function.file-put-contents.php)
15
17
 
18
+ ### 1行目?1列目?
19
+
20
+ > csvをDLしようとする際、必ず出力されるCSVの第一行目が空になってしまいます。
21
+ > 具体的には、1列目に入るべき値が2列目に入ってしまっています。
22
+
23
+ 「第一行目が空」で1行目と思い込んでいましたが、2行目では「1列目に入るべき値が2列目に入ってしまって」とあります。
24
+ 「1行目」と「1列目」のどちらが正しいのでしょうか。
25
+
26
+ 軽く調べたところ、PHPは基本的に BOM を解釈しないようなので、`fputcsv()` が BOMデータを有効な文字列を判断して、1列目に入るべきデータを「2列目のデータ」と判断して挿入している可能性があります。
27
+
28
+ ```
29
+ BOM,"Cell-1A","Cell-1B"
30
+ "Cell-2A","Cell-2B"
31
+ "Cell-3A","Cell-3B"
32
+ ```
33
+
34
+ これは質問文にある状況と一致する為、「1行目の1列目が空欄になってしまう」が正解な気がしますね。
35
+ 解決法は先述と同様、CSV文字列を自前で組み立てて、`file_put_contents()` で出力する事になります。
36
+ 調べてみたところ、PHPには `str_getcsv()` はありますが、CSV文字列を生成する関数はないようです。
37
+
38
+ - [PHP: str_getcsv - Manual](http://php.net/manual/ja/function.str-getcsv.php)
39
+
40
+ ライブラリを探すのも良いですが、それほど難しい仕様ではないので自前で作るのも良いかと思います。
41
+
42
+ - [CSVファイルの一般的書式 (RFC4180 日本語訳) - アルプス登山の玄関口・笠井家](http://www.kasai.fm/wiki/rfc4180jp)
43
+
16
44
  Re: YYama さん