- ベストアンサー
C言語のCSV形式からのソート
C言語初心者です。 C言語でCSV形式のテキストファイルを読み込み そのファイルの内容(数値)を昇順にソートして表示するプログラムを作りたいのですが中々上手く行きません・・・。 調べても分からず困っています。 どなたか教えていただけませんか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>C言語でCSV形式のテキストファイルを読み込み >そのファイルの内容(数値)を昇順にソートして表示するプログラムを作りたいのですが中々上手く行きません・・・。 >調べても分からず困っています。 「初心者」でしたら、「上手く行きません」のは当たり前で、困ることではないかと。 「もう少し」調べたらきっと解決しますよ。 ちなみに、「昇順」とは、「小さい順」のことです。 >21,10,8,6,5,1 の様にしたいです。 これは「降順」といいます。 ++++++++++++++++++++++++++++++++++++++ >プログラムはファイルを読み込んで一行そのまま表示してしまう状況です・・・。 テキストファイルの一行が、1,10,5,6,8,21 の場合、21 は「にじゅういち」という数値ではなく、「に・いち」という「文字列」であることは、(文字列用のフォーマット指定子を用いて)「表示」できたことから、お判りと思います。 http://www.k-cube.co.jp/wakaba/server/format.html ここから、読込時、または「文字列」として読込後、 ・6ケに切り分ける。 ・6ケの「数値」とする(◆)。 必要があります。 ★まずこれをクリアしては如何でしょう。 方法は色々あります。一例を下に示します(BorlandC++5.5.1)。 http://www.bohyoh.com/CandCPP/C/Library/index.html 蛇足(◆) 最終段階の「ソート」に関し、文字列のままでの大小比較関数も、標準ライブラリ関数に用意されています。 しかし、先頭から順に比較していくため、"5" と "10" では、「 "5" が大きい」となり今回の「ソート」には使えません。 なお、「ソート」については、意外と簡単?に解決できると思います。 考え方として、 テーブルに、通し番号の付いた6ケのコップが一列に並んでいます。 6ケのコップには、1,10,5,6,8,21 CC の水が入っているとします。 (個々のコップのテーブル上に置いた状態での位置は変えられません) これを 21,10,8,6,5,1 CC のコップ状態にするには、 ・空のコップ1つ(A)を用意します。 ・1番量の多いコップ(B)を6ケの中から「選び出し」、その水をAに待避します。 ・先頭のコップ(C)の水を、空になったBに移します。 ・空になった先頭のCに、Aの水を移します。 これで、1番のみ(先頭)が確定しました。 順次、5番まで確定すれば、6ケ全てが確定します。 なお、コップの通し番号を記憶し、出力時にその順番で、という方法もあります。 プログラムでは、コップを「配列」として実現します。 #include<stdio.h> #include<stdlib.h> #include<string.h> void main( void ) { int iVal[ 10 ]; // 「配列」 int nn = 0, i; char cBuf[ 256 ] = "1,10,5,6,8,21\n"; // ファイル1行模倣 char *p, *cTokn; // ファイル1行入力 p = cBuf; while( NULL != ( cTokn = strtok( p, ",\n" ) ) ){ // 切り分け iVal[ nn++ ] = atoi( cTokn ); // 数値化 p = 0x00; } for( i = 0; i < nn; i++ ) printf( "%2d\n", iVal[ i ] ); // 自作ソート関数呼び出し } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
その他の回答 (3)
- arain
- ベストアンサー率27% (292/1049)
>プログラムはファイルを読み込んで一行そのまま表示してしまう状況です・・・。 >ここからこれをどうしたらいいのか分かりません。 まず、こういった場合はソースを開示してください。 どこが悪くて、何が足りないのか質問文だけでは判断できませんよ。
補足
正直動く部分はWEBページ上にあるC言語の解説サイトでサンプルとして 紹介されているテキストファイルの読み込みだけなんです。 ですのでソースを載せるか迷ったのですが止めました。
- Tacosan
- ベストアンサー率23% (3656/15482)
特定の 1行だけソートすればいいのか, それとも各行をそれぞれソートしたいのか, はたまたすべての行のデータをまとめてソートしたいのか, いずれでしょうか? いずれにしても「読み込んだ行をカンマを区切りとして分解する」という作業が必要ですね. この処理は sscanf ではできないから, strtok か strtol とかを使うことになるでしょうか. 分解しちゃえばあとは普通にソートするだけ.
お礼
ソートは特定の一行だけですね。 難しそうですがカンマ区切りで分解する作業頑張ってやってみます。
- Tacosan
- ベストアンサー率23% (3656/15482)
そのテキストファイルや「どのようにソートしたいのか」という簡単な例はありませんか? また, 現在はどのようなプログラムになっていてどのように「うまくいかない」のでしょうか?
補足
>>Tacosanさん テキストファイルの内容はCSV形式の整数で特に決まった値はありませんが 1,10,5,6,8,21 この様なイメージです。 ソートに関しては改行せずこの場合ですと 21,10,8,6,5,1 の様にしたいです。 プログラムはファイルを読み込んで一行そのまま表示してしまう状況です・・・。 ここからこれをどうしたらいいのか分かりません。 分からないことばかりで申し訳ないです。
お礼
昇順の説明が間違っているとは予想外でした。 C言語以前の問題で恥ずかしいです・・・。 丁寧で分かりやすい解説ありがとうございます! まずは6個の数値にする必要があるのですね。 教えていただいたリンクとソースを基に自分なりに頑張ってみたいと思います。 また分からないことがあれば質問させてもらうかもしれませんが、その時はよろしくお願いします。 本当にありがとうございました。