• ベストアンサー

csvファイルからデータをダブらないように配列に格納するには?

PHPのスクリプトでどうやって組めばいいかわからないことがあり、 質問させていただきました。 以下のような10行×3列のカンマ区切りのファイル(test.csv)があるとします。 東京,名前1,3 神奈川,名前2,1 東京,名前3,1 愛知,名前1,1 大阪,名前2,2 京都,名前3,3 沖縄,名前1,3 東京,名前2,1 神奈川,名前3,3 福島,名前1,1 列に同じ名前のデータが入っていたりします。 (例えば1列目に東京が3つある) 1列目のデータからダブりがないように上から順に配列に格納するにはどうすればよろしいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

例えばこんな感じ <? $fname="hoge.csv"; $fp=fopen($fname,"r"); $prefecture=Array(); while($row=fgetcsv($fp,1024)){ if(!in_array($row[0],$prefecture) and $row[0]!="") $prefecture[]=$row[0]; } print_r($prefecture); ?>

php_rookey
質問者

お礼

in_array()関数を使ってうまく出来ました。 せっかく回答してもらったのに申し訳ないです。 ただ、これは違う部分で使うことになりました。 ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • mpx
  • ベストアンサー率71% (149/209)
回答No.1

>> 1列目のデータからダブりがないように上から順に配列に格納する 上記文章の解釈を誤っているかもしれませんが、  1列目のデータを連想配列のキーとして、順に配列に格納していけば キー(1列目のデータ)に重複はなくなります。

php_rookey
質問者

お礼

連絡遅くなって申し訳ありません。 他のことに追われてまして。 ちょっと意味が伝わりにくかったみたいですね。 そういうことではなかったんですが、どうやればいいか・・・。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • csvファイルを2次元配列に格納

    Javaの勉強をしています。 csvファイルを読み込んで2次元配列に格納する方法を教えて下さい。 1次元の配列なら下記のようにして出来たのですが、2次元の配列に格納する方法が分かりません。 ------------------------------ try { File csv = new File("xxx.csv"); BufferedReader brf = new BufferedReader(new FileReader(csv)); while(brf.ready()) { String line = brf.readLine(); String[] data = line.split(","); for(int j=0; j<data.length; j++) { System.out.print(data[j] + "\t"); } System.out.println(); } brf.close(); } catch(FileNotFoundException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } --------------------------- 一度はできないのかと思い、上記の1次元配列のdata[j]を2次元配列のarray[i][j]に代入してみたのですが出来ませんでした。 回答宜しくお願い致します。

    • ベストアンサー
    • Java
  • 思うような連想配列ができない・・

    省略して説明します。 関東,東京,神奈川,千葉 中部,愛知,静岡,岐阜 関西,大阪,兵庫,京都 というCSVデータがあり これを以下のような、連想配列にしたいのですがどうすればよいのでしょうか?? Array (   [0] => Array    (      [0] => 関東      [1] => 東京      [2] => 神奈川      [3] => 千葉    )   [1] => Array    (      [0] => 中部      [1] => 愛知      [2] => 静岡      [3] => 岐阜    )   [2] => Array    (      [0] => 関西      [1] => 大阪      [2] => 兵庫      [3] => 京都    ) ) --------------------------------- CSVデータを、feofで終端まで読み込み feofで一行ずつ取得 explodeでコンマで分解まではできるのですが 上記のような、連想配列ができません・・。 ご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • ExcelファイルをCSV 形式で保存するには?

    ExcelファイルをCSV 形式 (Windows、カンマ区切り) (*.csv)にして書類を提出するように言われたのですが、その方法について教えてください。 データの内容は会社の詳細で、1社につき100項目のデータがあり、それが50社あります。その場合、1社目のデータをA列に、2社目のデータをB列にというように入力すればよいのでしょうか? Excel の [名前を付けて保存] ([ファイル] メニュー) を使って、CSV (カンマ区切り) (*.csv)ファイルで保存すると、各項目がカンマで区切られるのでしょうか? 1レコード目と2レコード目はどういった区切りになるのでしょうか? またファイル形式はCSV 形式でと言うことですが、提出するファイル名の拡張子を.txtとしないといけないのですが、それはどうすればいいのでしょうか?

  • csvカンマ区切りデータに=""を入力したい

    csvカンマ区切りデータに、例えば、 ="00",="123",="456" といった感じで入力したいのです。 大元のcsvカンマ区切りデータで、 00,123,456 が入っているので、これをExcelを使ってText変換や書式設定で文字列にして みたのですが、csvデータとしては=""としては保存されていないのです。 どなたか、こういった型変換に詳しいかたご連絡をお待ちしています。

  • ExcelでのCSVファイルの編集について、

    ExcelでのCSVファイルの編集について、 オートフィルタ機能を使いたいため、 ExcelでCSVファイルの編集しようとしているのですが、ちょっと苦戦しています。。。 私が試してみたこと 1.もとのCSVファイルの拡張子を○○.csv → ○○.txtに変更。   ↓ 2.Excelの「開く」からその○○.txtを読み込む。   ↓ 3.テキストファイルウィザードに従い、   1「カンマやタブなどの区切り文字によって~ 」にチェック   2「区切り文字」→ カンマ、「文字列の引用符」 → "   3「列のデータ形式」 → 文字列 ※090などの数字を、90と先頭の0を消されないように 上記のような手順でCSVファイルを取り込み、編集を終え、 保存する時は   「○○.txtにはテキスト(タブ区切り)と互換性のない機能が含まれている可能性があります。    この形式でブックを保存しますか?」 → このまま保存するため「はい」を選択 これでバッチリOK!…かと思われたのですが、 元の編集前の○○.txt は"名前","ヨミ","電話番号1", …… ""とカンマ区切りであったのが、 編集後の○○.txtは名前 ヨミ 電話番号1  …… タブ区切り(?) となってしまっています。 (CSVファイルとしてはタブ区切りでも問題ないのでしょうが…) どうすれば元のカンマ区切りの形式のまま保存できますでしょうか。 アドバイスよろしくお願い致します。

  • 配列データをCSVでダウンロードしたい

    こんばんは。お世話になっております。 題名にある「配列データをCSVで・・」に関して、2つほど質問があり投稿させていただきます。 ヤフーのAPIを利用しているのですが(テストしている段階)、検索結果は提供されたデータが配列に格納されており、それを展開して検索結果として出力しています。 と、ここで、その結果をCSVでダウンロードすべく、配列データをimplodeで配列に収めて別ファイルにGETで渡し、渡されたデータをexplodeで配列に戻し、 header("Pragma: cache;"); Header("Content-type:application/vnd.ms-excel; charset=Shift_JIS"); header("Content-Disposition: inline; filename=$fname.csv");//ファイル名は一意な名前にしています。 $csv_line = implode("\n", $items); print(mb_convert_encoding($csv_line, "SJIS", "UTF-8")); と、やっております。 そこで質問なのですが、まず1つめ。APIで提供されているデータはUTF-8なので、上記のようにmb_convert_encoding()を使っていますが、文字化けでダウンロードしたデータを読むことが出来ません。 このような場合の対処の仕方は、どのようにすれば良いのでしょうか? また、2つ目の質問ですが、配列データをCSVでダウンロードするために、配列データを別ファイルに渡しているのですが、上記のようなやり方では、implodeで変数に代入すると文字列が長すぎて、正常にデータを渡すことが出来ません。 当初はCSVを生成するときもヤフーに接続して・・と行っていたのですが、これだと2度アクセスすることになり(1日のアクセス数の上限が定められている)、出来れば1度のアクセスで得たデータを利用したいと考えているのですが、このような場合、配列データを別ファイルに渡すにはどのようにするのが理想なのでしょうか?(セッションの利用も試したが上手くいきませんでした)

    • ベストアンサー
    • PHP
  • csvファイルを配列へ格納しブラウザへ出力

    <?php #CAT csvファイルを開く $fp_c = fopen("test.csv","r"); #domain csvファイルを開く $fp_domain = fopen("test.csv","r"); print "<table border='1'>"; #fgetcsv関数がfalseを返却するまで実行 while($c_data = fgetcsv($fp_c)){ print "<tr>"; #csvファイルの列数だけ実行 for($i=0;$i<count($c_data);$i++){ print "<td>".$c_data[$i]."</td>"; } print "</tr>"; } print "</table>"; var_dump($c_data); fclose($fp); ?> このようなプログラムをつくってcsvファイルの各セルを配列$c_data[$i]へ格納している(つもり) なのですが、var_dump($c_data);を入れると bool(false)と表示されてしまいます。 このプログラムではcsvファイルの中身を表示できても配列に格納されていないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • データを取得し、その度に新しい配列に格納したい

    こんばんは。 CSVファイルのデータを読み込むクラスを作っています。CSVファイルは30ほどあるので、カンマで区切ったトークンの数(StringTokenizerで区切ったトークンの数)と行数はファイルによって違います。 1つのクラスを作り、データを配列に読み込ませたいと思います。Vectorクラスを使うと出来たのですが、全部String型なので、ストリング型の2重配列に読み込ませたいです。 最初に、配列の宣言をしたのでは、配列のサイズが決まってしまうので、データ数により、配列の大きさを変えたいのですが、うまい方法が見つかりません。 誰か分かる方は、教えてください。よろしくお願いします。

    • ベストアンサー
    • Java
  • CSVファイルを多次元配列に格納する

    CSVファイルをopenCSVを読み込んでその行と列の要素数の多次元配列を作りその配列にデータを格納したいです。 しかし、データが格納できません。2回目の格納するためにwhileから何かおかしいのではないかと思っています。 なにかわかる方、アドバイスが欲しいです。 public class ReadCSV { public static void main(String[] args){ try{ CSVReader reader = new CSVReader( new FileReader("/home/masa/Desktop/WameiSample.csv")); //配列の宣言 String[] nextLine; //データを配列に入れる要素数を見る int j = 0; nextLine = reader.readNext(); int k = nextLine.length; System.out.println("列数[i]"+k); System.out.println("nextLine"+nextLine); while((nextLine = reader.readNext()) != null){ for (int i=0; i<nextLine.length; i++){ //System.out.print(nextLine[i] + "|" + i + "|"); } //System.out.println(); j++; } System.out.println("行数[j]"+j); //記憶する配列 String[][] Wamei = new String[k][j]; System.out.println("きてるよ"); //データを配列に格納していく int x = 0; while((nextLine = reader.readNext()) != null){ System.out.println("きてるよ");  <---こっから、表示してくれない. for (int y=0; y<nextLine.length; y++){ Wamei[x][y] = nextLine[y]; //多次元配列の要素を表示する System.out.print(Wamei[x][y]+"Wamei"+x+y); } System.out.println(); x++; } } catch (IOException e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • php配列格納

    $lines = file ('db.csv'); 上記でファイルの中身を配列に入れますがその逆で データを配列にして格納したいのですがどうすればいいのでしょうか? ファイルの不要な行を除いて再度変数に配列で格納しファイルを作成 したいのです。

    • ベストアンサー
    • PHP