CSVファイルについて

[戻る]
解答内藤斉藤 2010/03/15(月) 15:44:20
.csvファイルのA列(一番最初の列)の入力値がある範囲の行数を取得したい場合、どの
ようなやり方があるでしょうか?
読み込みでまず最初に行数を調べたいのです。

PATIO 2010/03/15(月) 15:59:11
提示されている内容では条件が足りないと思います。

どういう状況を想定して質問されているのでしょう?

もし純粋にC++のプログラムだけで行う事を想定しているなら
ファイルを読み込んでみるまで行数はわかりません。
単純に行数を数えるとしてデータ内の改行の数を数える事になるでしょう。
さらに条件が付くのであれば、それらの条件に関して行毎に調べて
条件に合致した行のみをカウントすると言う事になると思います。

そうではなくてエクセルやアクセスを使うのであれば、
またやり方は異なってきます。


どういう環境かに関してはご本人は頭の中にあるのでしょうけれど、
掲示板は文字のみのやり取りになりますから説明がない部分に関しては
掲示板を見ている人には分からない情報になります。

解答内藤斉藤 2010/03/15(月) 17:08:59
PATIOさん

わかりづらい文章ですいません。

読み込んだCSVファイルの行数を取得したいだけなんです。それを調べるカラムを
A列(一番最初の列)としました。

今作ってみたとここんな感じになりました。

char buf[150];                     //csv一行読み込み用
char abuf[2] = ",";                //比較用
char bbuf[2] = "";                 //比較用
int LineNum = 0;                   //行数取得用
while(fgets(buf,200,fp)!=NULL){    //fpはFILE* fp;
if(buf[0] == abuf[0]) break;
if(!strcmp(buf,bbuf)) break;
LineNum++;
}

こんな感じで最初のカラムの値があるものを一行としてカウントしたいのです。
良い方法はないでしょうか?

Blue 2010/03/15(月) 17:42:22
>char buf[150];
>while(fgets(buf,200,fp)!=NULL){
サイズが違うのはまずいかも。

>if(buf[0] == abuf[0]) break;
if (buf[0] == '\0') break;
で十分かも。

>良い方法はないでしょうか?
提示されているコードでも十分だと思うのですが何か気になることがあるのでしょうか?
一度全部読まない限り、何行あるかはわからないですし。


# 1,2,3
# ,3,5
# 7,4,2
# というのはないのね。

解答内藤斉藤 2010/03/16(火) 08:49:08
Blueさん

適切な指摘ありがとうございます。
ただ、今は

# 1,2,3
# ,3,5
# 7,4,2

というものはないですが、のちのちそのようなデータも読み込みたい場合、自分の実装で
は不十分な気がします。
そのため、今のうちに上記のようなパターンも網羅できる実装をしたいのですが、、、

ryo 2010/03/16(火) 09:37:38
比較用の文字列が用意されていますがこれはどういう意味でしょうか?

CSVに書かれている仕様、および、行数をカウントする条件として
「特定の文字がでてくるところまで数えたい」という話なら意味はあると思いますが

現在までに提示されている話だと、
「なんらかの条件でとめることなく、とにかくファイルの最後までの行数カウント」
のように見えます。

PATIO 2010/03/16(火) 09:50:22
条件に合致する行をカウントすると言う部分だけを考えると
一行分のデータを引き渡して条件に合致したかどうかを返却する関数を
イメージしておいてその関数を呼び出してTRUEが返ってきたら
カウントアップするみたいな構造にするくらいですかねぇ。
カウントアップする部分は条件による変更は無いので
条件判断するのに使う関数をカウントアップルーチンの外から
引き渡せるようにすると条件の部分だけ別の関数を作成して
引き渡す事でいろいろな条件に対応できる気がします。

と、ここまで書いておいてなんですが。
実際に行数をカウントするだけの部分のコードが大した事無いので
ここまで仕組み立てする意味があるのかと言う部分に関しては
ちょっと疑問が残ります。
このくらいのルーチンなら毎回書いてもそれほど負担にはならないかなと。

仕組みを考える訓練としては面白いかもと思いますが、
それ以上の意味が見出せないような気がします。

PATIO 2010/03/16(火) 09:58:50
追伸

やりたい事の説明をする時にどういう条件の元に行おうとしているのかを
説明する事を考えて見た方が良いかなと思います。

すくなくとも、言語に何を使うのか?
プログラミング言語だけで対応するつもりなのか?
コンソールアプリ?GUIアプリ?
等々。

説明した方が良い内容に関しては、入力欄上の「使用上の注意」を
参照してください。
うまく質問すると返事も付きやすくなります。

ITO 2010/03/17(水) 10:14:21
CSV形式に限らず,テキスト形式(アスキーで読めるファイル形式)のファイルの場合は、

まず、
 1.とにかく1行ずつ読込む。
 2.取得したデータを変数に保存する。
 3.読込み終了後の変数データをデバッグモードで調べる。
 4.必要な部分だけ取得するにはどうするか検討する。
 5.それでも分からない場合、ここの掲示板等で質問する。
ですね。

古いスレッドには追加発言できません。