
phpでCSVファルを読み込み処理をしたいです。
ファイルの中身が下記のようになっています。
"テスト","名前","不能","3","4","5"
プログラムで下記のように記載してみました。
$strFilePath = 'C:';
$strFileName = 'Test.csv';
$file = new SplFileObject($strFilePath.$strFileName);
$file->setFlags(SplFileObject::READ_CSV);
// ファイル内のデータループ
foreach ( $file as $key => $line ) {
$line=mb_convert_encoding( $line, "utf-8", "sjis" );
var_dump($line);
}
を実行すると
array(5) {
[0]=> string(9) "テスト"
[1]=> string(6) "名前"
[2]=> string(10) "不能",3""
[3]=> string(1) "4"
[4]=> string(1) "5"
}
と表示されます。
本当は下記のようになってほしいです。
array(5) {
[0]=> string(9) "テスト"
[1]=> string(6) "名前"
[2]=> string(6) "不能"
[3]=> string(1) "3"
[4]=> string(1) "4"
[5]=> string(1) "5"
}
「能」や「表」の5C問題でしょうか?
どうすれば、希望のようにカンマ区切りになるでしょうか?
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
"不能",の能の部分で発生しているいわゆる5C問題です。
次のライブラリで完全に解決できます。
https://packagist.org/packages/fw3/streams
他の方が書かれていたiconvを用いた変換の場合、変換不可能な文字があった場合、行そのものをなかった事として動作するので大変危険です。
その他、CSVのキャラクタセット変換における諸問題は次の資料に一通り全て記載されています。
https://speakerdeck.com/ickx/phperkaigi2021-phpd …
No.2
- 回答日時:
ご推察の通り 5C 問題の様です。
能(U+80FD) の SJIS 符号は `945C`
CSV のエスケープ文字のデフォルトは $escape = "\\"
https://www.php.net/manual/ja/splfileobject.setc …
SJIS を理解しないプログラムが 5C をエスケープ文字と判断して誤作動
これを解決するには UTF-8 の形式で SplFileObject に読み込ませばよいのですが、調べた限りエンコード指定の引数が無いようなので、フィルタでエンコード変換した結果の入力ストリームを読み込ませましょう。
例)
$fileName = "Test.csv";
$wrap = "php://filter/read=convert.iconv.CP932.UTF-8/resource=$fileName";
$file = new SplFileObject($wrap);
// 変換済みなので読み込み後の mb_convert_encoding は不要
参考)
https://www.php.net/manual/ja/wrappers.php.php#w …
https://www.php.net/manual/ja/filters.convert.ph …
No.1
- 回答日時:
本当にそのような問題なのだとしたら, 「根本から」処理しないと話にならないのではないだろうか.
https://qiita.com/bstyle6130/items/4db3911e0a89d …
https://innx-hidenori.hatenadiary.org/entry/2009 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
php でqiitaのサイトにあったファイルのダウンロード関数を使ってダウンロードしているのですが
PHP
-
perl の open について教えてください。
Perl
-
あってる
C言語・C++・C#
-
-
4
従業員が1名だけのSierっているんですか? プログラマー
その他(プログラミング・Web制作)
-
5
C言語 関数、変数の宣言について
C言語・C++・C#
-
6
IT業で開発をされてる方々に質問なんですが、一日に書かれるコード数ってどれくらいですか? また、最近
その他(プログラミング・Web制作)
-
7
趣味がプログラミングだと言ってもいい?
その他(プログラミング・Web制作)
-
8
PHPの勉強してます。 配列のところですが、 実行結果は、9になりますが、 そのロジックを教えてくだ
PHP
-
9
共テのプログラミング言語はPython等と違いほとんど日本語ですが、その共テのプログラミング言語を解
その他(プログラミング・Web制作)
-
10
VB.net 文字列から日付型へ変更したい
Visual Basic(VBA)
-
11
以下のプログラムの実行結果はどうなると思いますか? その理由も教えてください。
Visual Basic(VBA)
-
12
submitで思うようにページが遷移しない
PHP
-
13
C言語について(初心者)
C言語・C++・C#
-
14
COPYコマンドで、最後に1文字「Hex1A」が付くのはなぜ?外し方は?
その他(プログラミング・Web制作)
-
15
プログラム上での行のマージ方法
その他(プログラミング・Web制作)
-
16
visual studio 2022でのC#プログラミングのテンプレートについて
C言語・C++・C#
-
17
OS入ってる機器のソフト・アプリの作成(プログラム)って
その他(プログラミング・Web制作)
-
18
プログラミングに興味があるのですが、作りたいものはありません。 ゲーム機とかパソコンの中身(ソースコ
その他(プログラミング・Web制作)
-
19
算術演算子「¥」の意味について
Visual Basic(VBA)
-
20
C言語の関数のextern宣言
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpのheader("Location:#pos")...
-
PHPのエラーの解消法について教...
-
セッション関数を使わずにファ...
-
PHP8でWarning:Undefined varia...
-
composerをインストールしたい...
-
フォームで戻った際に入力済み...
-
SplFileObject を利用したとき...
-
phpの問い合わせフォームを作っ...
-
marginの値でマイナス値を設定...
-
submitで思うようにページが遷...
-
HTML PHP ラジオボタンのイベント
-
php でqiitaのサイトにあったフ...
-
PHPの勉強してます。 配列のと...
-
BASIC認証のフォームをデザイン...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
返信機能のツリー構造の深さを...
-
PHPについて。
-
PHPからCSVをアップロード後、m...
-
[php初心者]サイトを見てデータ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHP8でWarning:Undefined varia...
-
phpの問い合わせフォームを作っ...
-
composerをインストールしたい...
-
BASIC認証のフォームをデザイン...
-
SplFileObject を利用したとき...
-
phpでcookieがうまく保存されない
-
PHPのセッション有効期限について
-
PHPで画像の渡しが上手く行きま...
-
PHP8を使うと、大量のWarningが...
-
フォームで戻った際に入力済み...
-
Q&Aサイトを作成していてURLの...
-
PHPを使って、別サイトの一部を...
-
$_SESSIONに渡した後はそのまま...
-
reuterの記事をbeautiful.soup....
-
PHPSpreadsheetを使って関数を...
-
PHPのエラーの解消法について教...
-
ファイルの遷移がうまく行われ...
-
PostgreSQLからCSV形式でエクス...
-
php エラー
-
HTML PHP ラジオボタンのイベント
おすすめ情報