• ベストアンサー

csvファイルのタブで区切られた部分まで削除

csvファイルaを list($li_a,$li_b,$li_c,) = split("\t",$val); というようにタブで区切られた部分でリスト化しました。 配列の順番をabc順に並べようとして、 sortを使ったのですが、 一番初めの$li_aを基準に並べ変えられてしまいます。 $li_bを基準に並べ変えたい場合どうしたらよいのでしょうか。 csvファイルの一番初めのタブで区切られる部分まで削除という指示をすれば出来そうかなと思ったのですが、、、、。

  • PHP
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
  • cyanberry
  • ベストアンサー率50% (117/230)
回答No.3

同じことですが、お礼の内容を踏まえて以下ではどうでしょうか? $li_bをキー値とする配列を作成して、ksortすれば良いかと思います。 「$li_b.(++$count)」は$li_bが重複した値を持つ場合に上書きされないようにする対処です。 ---- $count = 0; $result =array(); $example = file('a.csv'); foreach ($example as $val) { list($li_a,$li_b,$li_c) = split("\t",$val); $result[$li_b.(++$count)] = array($li_a,$li_b,$li_c); } ksort($result); ----

hukazuo
質問者

補足

ありがとうございました。 この方法でできましたー。

その他の回答 (3)

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.4

繰返しで、回すこともないでしょう。 また、必要な部分を取り出す作業もいりますし。 こんなのでは? <?php $l = array('x3,3,y3','x0,0,y0','x1,1,y1','x2,2,y2'); $a = array_map('split', array_fill(0, count($l), ','), $l); usort($a, create_function('$x,$y', 'if($x[1] < $y[1]) return -1; else if($x[1] > $y[1]) return 1; else return 0;')); var_dump($a); ?> 最初の$lは、実際にはファイルから読みます。 ここでは、カンマ , で区切ってますが、タブ区切りならカンマの部分を書き直してください。

hukazuo
質問者

お礼

ありがとうございました^^

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.2

<?php $a = array(array('x', 'b', 'y'),array('xx', 'a', 'yy')); var_dump(usort($a, create_function('$x,$y', 'if($x[1] < $y[1]) return -1; else if($x[1] > $y[1]) return 1; else return 0;'))); var_dump($a); ?> こんなんで、どうでしょう?

hukazuo
質問者

お礼

ありがとうございます、、、。 何度かやってみたのですが、うまくいかなかったので、 ほかの方法で実行しました。

  • cyanberry
  • ベストアンサー率50% (117/230)
回答No.1

配列がどういう構成になっているのか分からないので、質問の意味がいまいちわからないのですが・・・。 予想で回答しますが、以下のような感じでどうでしょうか。 ---- $result =array(); $fp = fopen ("a.csv", "r"); while (!feof($fp)) { $val = fgets($fp); list($li_a,$li_b,$li_c) = split("\t",$val); $result[$li_b] = array($li_a,$li_b,$li_c); } ksort($result); ---- $li_bの値が重複する可能性がある場合はこの方法ではダメです。 「$li_b+通し番号」をキーにするなどの工夫が必要です。

hukazuo
質問者

補足

配列はa.csvを $example = file('a.csv'); というようにし、 [0]=>一行目 [1]=>二行目 [2]=>三行目 というようにしてます。 一行目の真ん中の文字列を基準に並べ変えたいのですが、、、・

関連するQ&A

  • csvファイルの読込みとソート

    いつも大変参考にさせていただいております。 csvファイルの読み込みとソートをしたく、ネットや過去ログ等を相当調べたのですが、完全に詰まってしまいました。 (検索キーワード:「php csv ソート」「php 二次元配列 ソート」など) とても困っています。どなたかよろしくお願いします。 以下のようなcsvファイルを読み込みソートしたいのです。 ■csvファイル 20110803, A, りんご 20111215, B, みかん 20110306, A, みかん 20110620, A, りんご 20110215, B, りんご ■個別にやりたい処理 (1)、左列の日付で昇順ソートしてすべて表示 (2)、「A」を含む行をすべて表示(日付順) (3)、「A」+「りんご」を含む行をすべて表示(日付順) □補足 csvをfgetcsvで読み込み、テーブルに入れて表示するところまではできました。 csvの行は増えていきます(max100行位)。列は固定。

    • ベストアンサー
    • PHP
  • foeach

    IDと名前とパスワードを入力したsample.csvがあり、 $shop = file('sample.csv'); として、foreachを利用して配列に入れたとします。 foreach($shop as $val){ list($li_id ,$li_name, $li_pass) = split("\t",$val); if($id == $li_id){ echo "a"; exit; }else{ echo"b"; exit; } } として、フォームから送られてきたIDと、 csvに入っているIDが一致したらaを表示、 一致しなければbを表示というように上記のプログラムを書きました。 しかし、csvファイルの一番上のIDでなければ、 すべてbが表示されてしまいます。 exit;をとると今度は、 「abb」や「bab」など、すべて表示されてしまいます。 どのようにすれば一致したらaを表示、しなければbを表示というようにできるのでしょうか。

    • ベストアンサー
    • PHP
  • PHPでCSVファイルの任意の行だけを編集したい

    簡易掲示板の管理画面を作成しようと思っていますが、 うまくいかずに悩んでいます。 入力フォームで送られてきた内容をcsvファイルに書き込み、 それを表示するという掲示板なのですが、 管理画面ではそのcsvファイルを操作して、 任意の書き込みを修正・削除できるようにしたいと考えています。 以下、PHPコードです。 if($mode == "edit"){ foreach($csv as $val){ list($li_no, $li_date, $li_comment) = split("\t",$val); if($li_no == $info_no){ $csv[$info_no] = "$id\t$date_y/$date_m/$date_d\t$comment\t\n"; fputs($fp,$csv[$info_no]); fclose($fp); } } }else{ $dat = "$id\t$date_y/$date_m/$date_d\t$comment\t\n"; $fp = fopen('$csv' , 'w'); fputs ($fp, $dat); for ($i=0; $i<1000;$i++){ fputs ( $fp,$csv[$i]); } fclose($fp); } 編集用のフォームで$info_noを飛ばして、 CSVファイル内の$li_noと一致した場合、 $li_noの行を書き換えという処理をしているつもりなのですが、 なぜか、他の行がすべて消えて、 編集した行だけがファイル内に残ります。 いろいろと検索して試してはみたのですが、 どうもうまくいきません。 どなたか教えてください。 お願いします。 これ以外の方法で簡単にできる方法があれば そちらも教えていただけたら幸いです。

    • ベストアンサー
    • PHP
  • CSVファイルを読み込み、ファイル名を変更。

    CSVファイルを読み込み、ファイル名を変更。 使用言語はperlです。perlは初心者です。 アルゴリズムが、 CSVファイルを読み込み→2次元配列に格納→ファイル名変更 という流れになっているプログラムを作成中です。 CSVファイルの中身は あ.txt , a.txt い.txt , b.txt う.txt , c.txt です。 CSVファイルを読み込み2次元配列に格納するプログラムは以下のようにしました。 ----------------------------------- $i= 0; open IN, "sample.csv"; while (<IN>) { my @data = (); @data = split (/,/); for (0..@data) {$jdata[$i][$_] = "$data[$_]";} $i++; } close IN; ---------------------------------------- 「あ.txt」を「a.txt」に変更しようとして、この中に rename $jdata[0][0] , $jdata[0][1] ; と書いてみましたが、変換されません。 どう書けばよいのでしょうか。よろしくお願いします。

    • ベストアンサー
    • Perl
  • VBSにてCSV読み込みし比較

    ある場所に比較するCSVファイルを2個格納しております。 ただしCSVファイル名は可変であります。 その場合 Set objTextA = objFSO.OpenTextFile("C:\" & "A.csv")と特定して呼び出せません。 名前が可変なときのため、そのパスにあるCSV2個を順に呼び出すにはどうすればよいのでしょうか。 また呼出し後、split関数により、配列に入れます。A配列とB配列に格納したとします。 一つ一つ比較していきたいのですが、 以下のような構文の場合、比較で違ったときテキストに書き込みとなりますでしょうか? for i=0 to i=10 step 1 if strcomp(a(i) ,b(i))) = 1 then テキストに書き込み endif next

  • タブで区切られたXXX.csvファイルをエクセルで開くには

    中身はタブで区切られた「XXX.csv」というファイルをエクセルでうまく開くにはどのようにすれば可能でしょうか? Excell2000を使用しています。 XXX.csvファイルをクリックすると、エクセルで開きますが、タブ区切りされておらず、セルAにすべて入ってしまいます。(行への展開は正しい) そのため、はじめにエクセルを開いておいて、ファイル名を指定しますが、これもうまくいきません。 どのようにすれば、タブ区切りという指定が出来て、Excellへ展開することが出来るのでしょうか?

  • PHPでCSVの一部の行を編集したい

    掲示板の管理画面の様な感じで、 PHPでCSVファイル内の一行を編集するフォームを作りたいと思っています。 フォームには新規投稿と、編集用のボタンがあり、 編集用で送られてきたものを受け取るPHPプログラムは以下の通りです。 if($mode == "edit"){ foreach($csv as $val){ list($li_id, $li_date, $li_comment) = split("\t",$val); $fp = fopen(csv' , 'w'); if($li_id == $info_no){ $csv[$li_id] = "$li_id\t$date_y/$date_m/$date_d\t$comment\t\n"; }else{ $csv[$li_id] = "$li_id\t$li_date\t$li_comment\t\n"; } } $fp = fopen('csv' , 'w'); fputs ($fp, $csv[$li_id]); for ($i=0; $i<1000; $i++){ fputs ( $fp,$csv[$i]); } fclose($fp); } としたのですが、うまくいきませんでした。 なぜか、編集した文章と、最後に新規で追記した文章が追加されてしまいます・・・・。 「あいうえお」を新規で追記した後、 1. あいうえお 2. かきくけこ 3. さしすせそ 4. たちつてと の2を編集すると 1.あいうえお 1.あいうえお 2.かきくけこ(編集した) 3.さしすせそ 4.たちつてと となってしまいます。。。。 新規で追記されたものがない場合は 空行が追記されてしまいます。 いろいろ試行錯誤したのですが、さっぱりわかりません。 教えて下さい。

    • 締切済み
    • PHP
  • csv元データーの数字の列が、""で囲まれているせいか、数値としてのソートできません

    次の式でソートしたいのですが、 @LINES = sort { (split(/\,/,$a))[0] <=> (split(/\,/,$b))[0] } @LINES; csv元データーの数字の列が、 "28000000","鈴木", のように""で囲まれているせいか、<=>で数値としてのソートできません。 cmpで文字列としてのソートは出来ます。 どうしたら良いのでしょうか?

    • ベストアンサー
    • Perl
  • csvファイルのソート

    perlで、csvファイルをある項目でソートした結果を表示したいのですが(つまりエクセルで並び替えをするようなこと)、ハッシュ配列等を使用しないとできないのでしょうか? 項目(列)は10項目くらいあります。

    • ベストアンサー
    • Perl
  • vb.netでCSVファイルを変換して新しいCSVファイルを作りたいの

    vb.netでCSVファイルを変換して新しいCSVファイルを作りたいのですが、どのようにすれば良いかヒントを教えていただけないでしょうか? A組,10代,10 A組,20代,20 A組,30代,30 B組,10代,40 B組,20代,50 B組,30代,60 C組,10代,70 C組,30代,80 この様なCSVファイルを変換して ,A組,B組,C組 10代,10,40,70 20代,20,50, 30代,30,60,80 という表のようなCSVファイルを作りたいのです。 データベースなどに入れずに、ファイルtoファイルでの変換がしたいです。 最初のファイルの1列目と2列目の項目をそれぞれ配列に入れて重複をなくす位までは思いつくのですが、そこから先がどの様にすれば良いかよく分かりません。 ヒントだけでも良いのでよろしくお願いいたします。