エクセルを利用して、下記のようなcsvファイルデータを作成して、
A列のセル内に含まれるカンマをプログラム内で削除する処理を行いたいのですが、どのようにすればよいでしょうか?
A列のセルに必ずカンマが含まれているかは不明という前提で、hoge.csvファイル自体には変更を加えないでカンマを削除したい次第です。
ご教示のほど、どうぞよろしくお願い申し上げます。
data
1//hoge.csv 2 3//csvデータはA列からK列まであり、A列以外にもカンマが含まれている列があったり、値がブランクのセルもランダムにある前提です。 4 5A1セル : 1,000いろは|12000 6B1セル : aaa 7C1セル... 8 9A2セル : 2000にほへ|100 10B2セル : bbb 11C2セル.... 12 13A3セル : 300とちり|1000 14B3セル : ccc 15C3セル.... 16 17A4セル : 4,000ぬるを|200 18B4セル : ddd 19C4セル.... 20
csv読み込み用に作成したプログラムは下記です。
php
1ini_set('auto_detect_line_endings',true); 2$strFilePath = "./"; 3$strFileName = 'hoge.csv'; 4 5//-------------------------------------------------- 6// 文字コードを変換した一時ファイルの作成 7//-------------------------------------------------- 8// ファイルの読み込み 9$data = file_get_contents($strFilePath. $strFileName); 10// 文字コードの変換(UTF-8 → SJIS-win) 11$data = mb_convert_encoding($data, 'UTF-8', 'SJIS-win'); 12// 一時ファイルの作成 13$temp = tmpfile(); 14// メタデータからファイルパスを取得して読み込み 15$meta = stream_get_meta_data($temp); 16// 一時ファイル書き込み 17fwrite($temp, $data); 18// ファイルポインタの位置を先頭に 19rewind($temp); 20 21//-------------------------------------------------- 22// ファイルの読み込み 23//-------------------------------------------------- 24// CSVファイルの読み込み 25$objFile = new SplFileObject($meta['uri'], 'rb'); 26$objFile->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY); 27$objFile->setCsvControl("\t"); 28 29//-------------------------------------------------- 30// データの取得 31//-------------------------------------------------- 32 33$list = []; 34foreach ($objFile as $row){ 35 //Aセル内のカンマを削除したものを$listに格納したい 36 var_dump($row); 37 exit(); 38 /* $row[0]に1行分のデータがカンマ区切りで格納されている状態です。 39 * array(1) { 40 * [0] => string(xxx) "1,000いろは|12000,aaa,....." 41 * } 42 */ 43}
###csvデータをテキストエディタで読み込んだ場合
csv
1//カンマが入っているセルデータにはダブルクォテーションが入っていました。 2 31行目 : "1,000いろは|12000",aaa,..... 42行目 : 2000にほへ|100,bbb,...... 53行目 : 300とちり|1000,ccc,..... 64行目 : "4,000ぬるを|200",ddd,..... 7
#追加で判明したこと
試しに、A列の前に一列足してみたところ、2番目の行データからカンマが含まれているとforeach内の$row[0]内でダブルクォーテーションで囲まれることがわかりました。
先頭行の場合は、カンマが含まれていてもダブルクォテーションでは囲まれませんでした。
一方、テキストエディタで読み込んだ場合は、先頭行かどうかに関わらず、カンマがあるデータはダブルクォテーションで囲まれていました。
####先頭行のセルデータにカンマがある場合
php
1 2foreach ($objFile as $row){ 3 var_dump($row); 4 exit(); 5 /* $row[0]に1行分のデータがカンマ区切りで格納されている状態です。 6 * array(1) { 7 * [0] => string(xxx) "1,000いろは|12000,aaa,....." 8 * } 9 */ 10} 11
先頭行以外のセルデータ内にカンマがある場合
php
1 2foreach ($objFile as $row){ 3 var_dump($row); 4 exit(); 5 /* 1,000いろは|12000がダブルクォーテーションで囲まれている。 6 * array(1) { 7 * [0] => string(xxx) "100番目,"1,000いろは|12000",aaa,....." 8 * } 9 */ 10}
回答2件
あなたの回答
tips
プレビュー