phpのソート方法と要約文

このQ&Aのポイント
  • phpでのソート方法について教えてください。具体的には、あるログファイルから特定の条件に合うデータを抽出し、そのデータを特定の順序でソートして保存する方法が知りたいです。
  • ログファイルから指定の条件に合うデータを抽出し、計算した結果を用いてソートする方法が知りたいです。具体的には、ログファイルから1番目のデータが2番目のデータよりも大きいデータのみを対象に抽出し、そのデータを1番目のデータから2番目のデータを引いた数でソートしたいです。
  • phpを使用してログファイルの処理を効率的に行いたいです。具体的な要件は、ログファイルから特定の条件に合うデータを抽出し、そのデータを計算した結果でソートし、新しいログファイルに保存することです。この処理を一度に実行する方法を教えてください。
回答を見る
  • ベストアンサー

phpでのソートについて

phpのソートについて教えてください。 以下のようなカンマ区切りのログファイルlog.txtがあるとしまして、 100,200,a,b,c, 300,100,d,e,f, 500,60,g,h,i, 50,300,j,k,l, 1000,60,m,n,o, このデータから 1番目のデータ(数値)が2番目のデータ(数値)より大きいデーターのみを対象にして ※つまりは以下のみ対象 300,100,d,e,f, 500,60,g,h,i, 1000,60,m,n,o, ここから1番目のデータ(数値)から2番目のデータ(数値)を引いた数が大きい順に ソートしてファイルに保存させたいのですが、 200,d,e,f,(300-100なので200) 440,g,h,i,(500-60なので440) 940,m,n,o,(1000-60なので940) ↓ ※最終的にこの順番で新しいログファイルnewlog.txtへ保存させたい 940,m,n,o, 440,g,h,i, 200,d,e,f, これらの処理を効率よく1度で行う方法はございますでしょうか。 わかりにくい説明で申し訳ありません。 お忙しい中恐縮ですがご教授いただけましたら幸いです。 何卒宜しくお願い致します。

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

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

このくらいなら力技でゴリゴリ書いてもいいような気がします。 <?php $data = file('log.txt'); $out = array(); foreach ($data as $val) { $arr = str_getcsv($val); $diff = $arr[0] - $arr[1]; if ($diff < 0) { continue; } array_shift($arr); array_shift($arr); array_unshift($arr, $diff); $out[] = implode(',', $arr); } usort($out, 'ucomp'); $fp = fopen('out.txt', 'w'); foreach ($out as $val) { fwrite($fp, $val . PHP_EOL); } fclose($fp); print "Done"; function ucomp($arg1, $arg2) { $arr1 = str_getcsv($arg1); $arr2 = str_getcsv($arg2); if ($arr1[0] == $arr2[0]) { return 0; } return ($arr1[0] - $arr2[0]) ? -1 : 1; }

bou1025
質問者

お礼

ありがとうございました。 どうしてもエラーになってしまいましたので 調べてみましたところご教授いただいた方法ですと str_getcsvがphp5以降しか利用できないようでしたので その部分をphp4代であるなら利用できるような方法はないものかと調べましたが どうしても自分では解決できなかったため別の方法にて自己解決致しました。 バージョン4と5で利用できない関数があるないとおおまかな部分しか言えず 申し訳ありませんでした。 お蔭様で自己解決する事ができました。

bou1025
質問者

補足

お忙しい中、ご回答いただきましてありがとうございます。 はじめに環境を書くべきでした。 大変申し訳ありません。 ご教授いただきましたソースですとphp4ですと動かないようです。 サーバーがphp4の環境でも稼動できるようにするにはどうすれば良いでしょうか。 当方の説明不足で何度もお手数をおかけして申し訳ありません。

その他の回答 (1)

  • 4017B
  • ベストアンサー率73% (1305/1776)
回答No.2

PHPのver.は末尾のマイナーバージョンまで書かないと意味が無いです。 4と5が全く別物なのは当然として。v4.12 と v4.22 とかでも、同じ関数でも使える引数が違っていたり、処理が異なっている場合もあります。 /*--我々はエスパーでは無い!--*/

bou1025
質問者

お礼

4と5では使えるものが違う程度の知識しかなく質問の仕方も悪く申し訳ありません。 4なら殆どは4で利用できるものと思い込んでおりました。 ご指摘ありがとうございました。

関連するQ&A

  • ソート

    読み込むファイル(sample.txt)は、 2,jirou 5,gorou 4,shirou 1,tarou 6,mutsuo 3,saburou 下記の処理をします。 #include<stdio.h> #include<string.h> #define N 6 int sort1[N]; char sort2[N][30]; int BubbleSort(int data[N]) { int i,j,flag; do{ flag=0; for(i=0;i<N-1;i++) { if(data[i]>data[i+1]) { flag=1; j=data[i]; data[i]=data[i+1]; data[i+1]=j; } } } while(flag==1); return 0; } int main(void) { FILE *fpin; int id,h,k; printf("\n"); fpin=fopen("sample.txt","r"); if(fpin==NULL){ printf("ファイルをオープンできず!\n"); return 1; } for(k=0;k<N;k++) { h=fscanf(fpin,"%d,%s",&sort1[k],sort2[k]); if(h==EOF) break; printf("%d %s\n",sort1[k],sort2[k]); } printf("\n"); BubbleSort(sort1); for(k=0;k<N;k++) printf("%d %s\n",sort1[k],sort2[k]); return 0; } 実行結果は、 2 jirou 5 gorou 4 shirou 1 tarou 6 mutsuo 3 saburou 1 jirou 2 gorou 3 shirou 4 tarou 5 mutsuo 6 saburou 名前(sort2)もソートさせるには、どうすればいいか手ほどきをお願いします…

  • Bシェルで、1文字づつ読み込み、番地と共に出力する方法を教えてください。

    Bシェルで、1文字づつ読み込む方法を教えてください。 次のように文字が並んでいて、 A B C D E F G H I J K L M N O P それぞれの番地と共に、上記の文字を出力する場合、 どのようにしたら宜しいでしょうか。 入力ファイル:test.txt A B C D E F G H I J K L M N O P ↓ 1 2 3 4 1 A B C D 2 E F G H 3 I J K L 4 M N O P ↓ 出力ファイル A 1 1 B 2 1 C 3 1 D 4 1 E 1 2 F 2 2 G 3 2 H 4 2 I 1 3 J 2 3 K 3 3 L 4 3 M 1 4 N 2 4 O 3 4 P 4 4 番地に関しては、次のシェルを作成しましたが、 test.txtをどのように入力したら良いかが分かりません。 Xmax=4 Ymax=4 yy=1 while [ $yy -le $Ymax ] ; do xx=1 while [ $xx -le $xMax ] ; do echo $xx $yy | awk '{ printf(" %d %d ",$1,$2) }' >>out.txt xx=`expr $xx + 1` done yy=`expr $yy + 1` done 宜しくお願いします。

  • Bシェルで、1文字づつ読み込む方法を教えてください。(バイナリ)

    Bシェルで、1文字づつ読み込む方法を教えてください。(バイナリ) 以前、下記の質問をして、回答を頂きました。 この中の入力ファイル『test.txt』がバイナリ形式だった場合は、 どのようにしたら良いでしょうか。 ### 質問 ############################################ 次のように文字が並んでいて、 A B C D E F G H I J K L M N O P それぞれの番地と共に、上記の文字を出力する場合、 どのようにしたら宜しいでしょうか。 入力ファイル:test.txt A B C D E F G H I J K L M N O P ↓ 1 2 3 4 1 A B C D 2 E F G H 3 I J K L 4 M N O P ↓ 出力ファイル A 1 1 B 2 1 C 3 1 D 4 1 E 1 2 F 2 2 G 3 2 H 4 2 I 1 3 J 2 3 K 3 3 L 4 3 M 1 4 N 2 4 O 3 4 P 4 4 ### 回答 ############################################ yy=1 while read line; do xx=1 set -f $line while [ $# -gt 0 ]; do echo $1 $xx $yy shift xx=`expr $xx + 1` done yy=`expr $yy + 1` done < test.txt ##################################################### どうぞ宜しくお願い致します。

  • エクセルの使い方についてお教えください。

    エクセルの使い方についてお教えください。 例えば、 a | b | f c | g | j d | h | k | m e | i | l | n | o | のように、右肩下がりになっている列を、 a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | のように一列にまとめる方法は無いでしょうか? 何卒よろしくお願いいたします。

  • 難解なエクセル集計の仕方を教えてください!!

    以下のように集計したいのですが、いい方法はありませんか? 解りにくいですが、宜しくお願いします!!! ------------------------ 【関係図】  (1)(2)という2つグループの関係を表しています。  組織図のようなものと思ってくださって結構です。 ■元データ 【表あ】  関係図を分解し、2つごとの関係に直したデータです。   【表い】  それぞれA-Oに対応する数字が入っています。 ■集計要望 【表あ】と【表い】ふたつのデータを元に、関係図に基づいた集計をしたい。 例: 1.Aを集計すると、Aの下位のものはすべて集計したい。(A~Gまでの集計) 2.Dを集計すると、Dの下位のみが集計されるようにしたい。(D+E+F+G) 3.Fを集計すると、Fの下位のみ集計したい。(F+G) 4. Iを集計=I+K、Jを集計=J+L+M+N+O 【関係図】  (1)A-B-C      D-E       F-G  (2)H-I-K     J-L-M       N-O 【表あ】  A ― B  B ― C  B ― D  D ― E  D ― F  F ― G  H ― I  I ― K  H ― J  J ― L  L ― M  L ― N  N ― O 【表い】 A=1 B=2 C=4 D=5 E=6 F=7 G=8 H=9 I=10 J=11 K=12 L=13 M=14 N=15 O=16

  • 2行のセルの入れ替え。

     初めまして、よろしくお願いします。  セルに A B C D E F G H I J K L 1 a b c d e f 2 g h i j k l 3 m n o p q r 4 s t u v w x 5 " ・ " ・ " ・ " 100 "  という表があります。これを A B C D E F G H I J K L 1 a b c d e f g h i j k l 2 m n o p q r s t u v w x 3 " 4 " 5 " ・ " ・ " ・ " 100 "  という風に、偶数行のデーターを奇数行の後ろにつけるようにしたいと思います。無理ならば奇数行だけのデーター、偶数行だけのデーターとなるように、何かよい方法を教えて頂きたく、よろしくお願いします。

  • エクセル:データの間にスペースを入れて表示させたいのですが

    エクセル:データの間にスペースを入れて表示させたいのですが エクセル2007を使用しています。 英数や+-が混在した30桁のデータの間に スペースを7・4・4・4・7・4 文字毎に 入れて表示させたいのですが いい方法はあるでしょうか?   a0b1c2d3e-f3g-h4i5j6k+l7m8n9o+ を   a0b1c2d 3e-f 3g-h 4i5j 6k+l7m8 n9o+ の様に表示させたいのですが。 ご存知の方がいらっしゃいましたらお教え下さい。 宜しくお願いします。

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • 16進数のデータをソートするには?

    Linux上で16進数のデータをソートしたいのですがどうすれば実現できるでしょうか? [test.txt] 11009 292f 6551 e6f6 ↓のようにソートしたい 292f 6551 e6f6 11009 手順はまず、16進数→10進数に変換してからソートでしょうか? もしそうだとしても10進数に変換するところでつまずいています。 awkのprintfでやると下記のようにエラーがでます。 (頭に0xを追加して試してもダメでした) $ awk '{printf (%d, $1)}' test.txt awk: {printf (%d, $1)} awk: ^ syntax error awk: {printf (%d, $1)} awk: ^ syntax error ↓これだと変換できるのは知っているのですが・・・。 $ printf "%d\n" 0x292f 10543 以上、よろしくお願いします。

  • エクセル 条件に当てはまるセルの値を返す方法

    こんにちは、よろしくお願いします。   D   E   F   G   H   I ・・・・・N    O  1 北海道 東京 愛知 大阪 京都  沖縄  2  1   2   3   4   5   6        愛知  3  2   3   6   5   1   4        北海道    4  4   2   3   1   5   6        東京   5  2   3   6   5   1   4        京都  6  1   2   3   4   5   6        北海道 となっている表があります。(本来はMまで地名が入っています) この時にNに該当の数字を入れたいのです。 具体的にはN2に3、N3に2、N4に2となっていきます。 =IF(O2=$D$1,D2,IF(O2=$E$1,E2,IF(O2=$F$1,F2,IF(O2=$G$1,G2, IF(O2=$H$1,H2,IF(O2=$I$1,I2,IF(O2=$J$1,J2,IF(O2=$K$1,K2,(O2=$L$1,L2))))))))) とやってみたのですが、やたら長くスマートではない上に、これ以降が エラーになって入力できなくなってしまいました。 良い方法を知っていればご教授下さい。 お願いします。 mac OS10.5 excel2004を使用しています。

専門家に質問してみよう