質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

3591閲覧

PHPを使用したCSVファイルの整形について

vike

総合スコア17

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2017/07/25 15:12

###前提・実現したいこと
csvを読み込み整形し、その整形したものをcsvに出力しグラフ化したい

csvファイルの整形
⑴配列の空要素の削除

⑵下のような形のcsvを使用しているのですが、このような塊が続いているので、ある行より下の削除を行いたいです。

0歳,1歳,2歳,3歳,4歳,5歳,6歳,7歳,8歳,9歳,10歳,11歳,12歳,13歳,14歳,15歳,16歳,17歳,18歳,19歳,20歳,21歳,22歳,23歳,24歳,25歳,26歳,27歳,28歳,29歳,30歳,31歳,32歳,33歳,34歳,35歳,36歳,37歳,38歳,39歳,40歳,41歳,42歳,43歳,44歳,45歳,46歳,47歳,48歳,49歳,50歳,51歳,52歳,53歳,54歳,55歳,56歳,57歳,58歳,59歳,60歳,61歳,62歳,63歳,64歳,65歳,66歳,67歳,68歳,69歳,70歳,71歳,72歳,73歳,74歳,75歳,76歳,77歳,78歳,79歳,80歳,81歳,82歳,83歳,84歳,85歳,86歳,87歳,88歳,89歳,90歳,91歳,92歳,93歳,94歳,95歳,96歳,97歳,98歳,99歳,100歳,101歳,102歳,103歳,104歳,105歳,106歳,107歳,108歳,109歳,110歳,111歳,112歳,113歳,114歳,115歳,116歳,117歳,118歳,119歳,120歳以上,65歳以上,平均年齢

A県23211,01,001,004,,2017/6/1,,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,5,5,3,2,4,1,1,0,2,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,36.60
B県
23211,01,001,005,,2017/6/1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41.50

C県
23211,01,001,005,,2017/6/1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56.00

⑶グラフ化にchart.jsを使用したいと考えており、このような並びから
A県のX歳 B県のX歳 C県のX歳
↓ ↓ ↓
2225, 3333, 1111
このようにそれぞれの項目のX歳のみの項目で
整形して出力したいのですがどのように行えば良いでしょうか。

###該当のソースコード

php

1<?php 2setlocale(LC_ALL, 'ja_JP.UTF-8'); 3 4$file = 'data1.csv'; 5$data = file_get_contents($file); 6$temp = tmpfile(); 7$csv = array(); 8$key = 0; 9 10fwrite($temp, $data); 11rewind($temp); 12 13 14$f = fopen("test.csv", "w"); 15 16 17$delete_column = array(0,4,8,5,11); 18 19while (($data = fgetcsv($temp, 0, ",")) !== FALSE) { 20 21 22 foreach($delete_column as $col_num){ 23 24 unset($data[$col_num]); 25 } 26 27 28 $csv[] = $data; 29} 30 31 32if ( $f ) { 33 34 foreach($csv as $line){ 35 36 37 fputcsv($f, $line); 38 } 39} 40 41fclose($f); 42 43//空要素の削除 44$csv = array_filter($csv); 45 46 47 48print_r($csv); 49 50fclose($temp); 51 52 53//var_dump($csv); 54?> 55

###試したこと
空要素を削除するために
$csv = array_filter($csv);
を使用してみたが結果は変わらなかった

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  1. 配列の空要素の削除

unset関数で一撃です。

PHP

1<?php 2$arr = [ 3 "123", 4 "234", 5 "345", 6]; 7 8unset($arr[1]); 9 10var_dump($arr); 11// array(2) { 12// [0]=> 13// string(3) "123" 14// [2]=> 15// string(3) "345" 16// }
  1. 下のような形のcsvを使用しているのですが、このような塊が続いているので、ある行より下の削除を行いたいです。

ある行
行と列を混同してるのではという印象を受けました。
それともこのCSVファイルはC行以降にもD、E等と続いている形式であり、C行以降全て消したいという要望ですか?

まぁ、どちらにせよ新しい変数を作ってコピーを取る方が簡単です。
参照されなくなった変数はPHPのガベージコレクションによって勝手に掃除されて居なくなるので、特に重いファイルを読み込んだりしない限り使いっぱなしで大丈夫です。

  1. グラフ化にchart.jsを使用したいと考えており、このような並びから A県のX歳 B県のX歳 C県のX歳...

ちょっとずつ書き込んで、ちょっとずつ読み込んでが敗北フラグです。
まずはパフォーマンス度外視で分かりやすい手順で作っていきましょう。

CSVを読み込む場合、兎に角レコード→カラムの2重配列を作る事を意識しましょう。
下記は1カラム目をKeyとする連想配列を作る関数to_csvを即興で作ってみました。

PHP

1<?php 2 3function to_csv($str) { 4 $results = []; 5 $records = explode("\n", $str); 6 $columns = str_getcsv(array_shift($records)); 7 8 var_dump($records); 9 // array(2) { 10 // [0]=> 11 // string(11) "1,miyabi,30" 12 // [1]=> 13 // string(9) "2,vike,40" 14 // } 15 // ※ array_shift関数の効果で先頭行が取り除かれる 16 // => 後のforeachで各行にstr_getcsvを実行して一気に取り出す 17 18 var_dump($columns); 19 20 // カラム名をkeyとする連想配列を作り直す 21 foreach ($records as $record) { 22 $results[] = array_combine($columns, str_getcsv($record)); 23 } 24 return $results; 25} 26 27$str = <<<EOF 28id,name,value 291,miyabi,30 302,vike,40 31EOF; 32 33$csv = to_csv($str); 34var_dump($csv);

3箇所にver_dumpを仕込んで実行。
いい感じに2重配列の連想配列が出来上がったみたいですね。

Bash

1$ php test.php 2array(2) { 3 [0]=> 4 string(11) "1,miyabi,30" 5 [1]=> 6 string(9) "2,vike,40" 7} 8array(3) { 9 [0]=> 10 string(2) "id" 11 [1]=> 12 string(4) "name" 13 [2]=> 14 string(5) "value" 15} 16array(2) { 17 [0]=> 18 array(3) { 19 ["id"]=> 20 string(1) "1" 21 ["name"]=> 22 string(6) "miyabi" 23 ["value"]=> 24 string(2) "30" 25 } 26 [1]=> 27 array(3) { 28 ["id"]=> 29 string(1) "2" 30 ["name"]=> 31 string(4) "vike" 32 ["value"]=> 33 string(2) "40" 34 } 35}

何故2重配列の連想配列にした時点で勝ち確定なのか?
何故ならば、PHPは配列操作の関数が豊富なので、どうとでもなるからです。
では、上記のto_csvを使って解決しましょう。

PHP

1<?php 2 3$csv = [ 4 ["X歳" => "123"], 5 ["X歳" => "234"], 6]; 7 8$targets = []; 9foreach ($csv as $record) { 10 $targets[] = $record["X歳"]; 11} 12 13// CSVに戻すにはjoin (or implode)関数を使えばOK 14var_dump(join(',', $targets)); 15// string(7) "123,234"

パフォーマンスを意識するなら改良は下記の記事が参考になるので一度目を通してみてね。
【PHP】その CSV 変換、本当に「fgetcsv」でいいの?

投稿2017/07/25 23:04

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問