-PR-
解決済み

クラス StringTokenizerのコンストラクタ

  • 困ってます
  • 質問No.56252
  • 閲覧数789
  • ありがとう数6
  • 気になる数1
  • 回答数11
  • コメント数0

お礼率 13% (21/151)

あるCSVファイルから行を読み込んで、以下のように文字列を配列に格納しようとしたのですが、カンマとカンマの間の文字列がNULLの時に、次のカンマにある文字列がずれて格納されてしまいます。
例外処理(if文)で処理を振り分けるなどとして、NULLもきちんと配列におさめるにはどのようにすればよろしいのでしょうか?



line = csvfile.readLine();
StringTokenizer analy = StringTokenizer(line,",");
String[] moji = new String[analy.countTokens()];
for (int n=0; n<moji.length; n++){
moji[n] = analy.nextToken();
}

通報する
  • 回答数11
  • 気になる1
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.11
レベル9

ベストアンサー率 30% (25/83)

xinmanです。
>文字列操作関数(?)のtrim()って文字列両端の空白文字を削除する関数ですか??
そのとおりです。
少しは、お役に立てたでしょうか?
お礼コメント
mune

お礼率 13% (21/151)

かなり役に立ちました。
実際にプログラムまで書いていただいて・・・
いろいろとありがとうございました。
投稿日時 - 2001-04-02 15:45:52
関連するQ&A
-PR-
-PR-

その他の回答 (全10件)

  • 回答No.10
レベル9

ベストアンサー率 30% (25/83)

xinmanです。 こんなのもありかな? moji2[n2]=" "; の方を使って String[] moji = {"AAA"," ","CCC"}; とある時に String str = "AAA, ,CCC"; をつくり StringTokenizer anal ...続きを読む
xinmanです。

こんなのもありかな?

moji2[n2]=" ";
の方を使って

String[] moji = {"AAA"," ","CCC"};
とある時に
String str = "AAA, ,CCC";
をつくり
StringTokenizer analy = new StringTokenizer(str,",");
analy.nextToken().trim();

"AAA"
""
"CCC"
を取得することは出来ます。

プログラムで空白を付け足しても、trim()で削除することで空の文字列を作れます。
この場合は、最初から入っていた空白も削除されますんで、その辺は注意が必要です。
補足コメント
mune

お礼率 13% (21/151)

ありがとうございます。
ちなみに、文字列操作関数(?)のtrim()って文字列両端の空白文字を削除する関数ですか??
他の言語でlefttrim()、righttrim()っていうのは使ったことがあるのですが・・・
ボクのjavaの参考書にはtrim()関数の説明がのっていない!!
投稿日時 - 2001-03-30 15:42:34


  • 回答No.1
レベル7

ベストアンサー率 44% (8/18)

java.util.StringTokenizer ですよね? インスタンスを作成するときに以下のコンストラクタを使ってみて下さい。 public StringTokenizer(String str,String delim,boolean returnTokens) 第3引数の returnTokens に true を指定すると、区切り文字自身も一つのトークンとして取得できます。 例 ...続きを読む
java.util.StringTokenizer ですよね?
インスタンスを作成するときに以下のコンストラクタを使ってみて下さい。
public StringTokenizer(String str,String delim,boolean returnTokens)

第3引数の returnTokens に true を指定すると、区切り文字自身も一つのトークンとして取得できます。

例) コンマ区切り aaa,,bbb
第1トークン aaa
第2トークン ,
第3トークン ,
第4トークン bbb

この方法を使えば、件の目的は果たせるのでは無いでしょうか?
お礼コメント
mune

お礼率 13% (21/151)

早速ありがとうございます。
trueを指定して試してみたのですが、区切り文字も入ってしまうのですね。
第1トークンaaa
第2トークン
第3トークンbbb
といった具合にするには、やはり独自に細かいプログラムを作成しなければいけないのでしょうか・・・
投稿日時 - 2001-03-27 10:20:06
  • 回答No.7
レベル9

ベストアンサー率 30% (25/83)

xinmanです。 ばらばらと、まとまりの無い回答で申し訳ありません。m(__)m StringTokenizerについての補足です。 原則的にStringTokenizerは一度読み込んだら終わり的な、使い捨てのClassです。プログラムで使用するときも再利用は出来ないのでそのつもりで使いましょう。 (宣言したクラス変数は新しいStringTokenizerオブジェクトを割り当てることで利用でき ...続きを読む
xinmanです。
ばらばらと、まとまりの無い回答で申し訳ありません。m(__)m
StringTokenizerについての補足です。
原則的にStringTokenizerは一度読み込んだら終わり的な、使い捨てのClassです。プログラムで使用するときも再利用は出来ないのでそのつもりで使いましょう。
(宣言したクラス変数は新しいStringTokenizerオブジェクトを割り当てることで利用できます)

先答の訂正:StriongはStringの誤りです。ゴメンナサイ。
  • 回答No.6
レベル9

ベストアンサー率 30% (25/83)

xinmanです。お礼拝見しました。 >この状態(つまり、","を格納していない状態)で、またStringTokenizerのanalyに戻すことってできるのでしょうか? Striong str = 配列を","つきで編集したもの; analay = new StringTokenizer(str,",",true); とすることで ...続きを読む
xinmanです。お礼拝見しました。

>この状態(つまり、","を格納していない状態)で、またStringTokenizerのanalyに戻すことってできるのでしょうか?
Striong str = 配列を","つきで編集したもの;
analay = new StringTokenizer(str,",",true);
とすることで再度StringTokenizerを生成することが出来ますが…
必要ですか?

>配列を指定して文字列を取得するのではなく、できればanaly.nextToken()を使って文字列を所得したいのですが・・・
これはmoji1、moji2、2つも配列を使うなということですか?
であれば再度ロジックを考えます(以下は配列の使用を1つにするための話です)。

ただし、StringTokenizerの仕様上与えられた文字列は先頭から順次評価されていきますが、一度評価されたものは再度評価されない構造になっています。
例えば、
new StringTokenizer("AAA,BBB,CCC",",");
とあった場合、nextToken()を使用することで
"AAA"
"BBB"
"CCC"
と取得できますが、StringTokenizer自体はnextToken()により"AAA"を取得した時点で再度"AAA"を取得することが不可能な状態になります。
この時点では、
new StringTokenizer("BBB,CCC",",");
と記述した場合と同等のStringTokenizerになっています。
また、カンマ(区切り文字)が並んで記述されている文字列に対して、カンマとカンマの間にnull若しくはそれに準ずるものを生成する機能はStringTokenizerには用意されていないので必要な場合はプログラムを記述しなければなりません。

muneさんが考えているのはStringTokenizerから直接配列に取り込む方法だと思いますが、この場合は少なくともカンマの数を数えておくことと、カンマが連続していることを識別することが必要になりますので、純粋にStringTokenizerから配列にすることは不可能だと思います。
また、カンマを数えるためには、もとの文字列 line かStringTokenizer(line,",",true)のどちらかは利用しないと難しいと思いますがいかがでしょうか?
line に対してカンマの数を数え、StringTokenizer(line,",",true)を使用するのと
1度目のStringTokenizer(line,",",true)でカンマの数を数え、2度目のStringTokenizer(line,",",true)を使用するのとるのと
どちらが宜しいですか?
  • 回答No.8
レベル9

ベストアンサー率 30% (25/83)

>この状態(つまり、","を格納していない状態)で、またStringTokenizerのanalyに戻すことってできるのでしょうか? >配列を指定して文字列を取得するのではなく、できればanaly.nextToken()を使って文字列を所得したいのですが・・・ これって String[] moji = {"AAA","BBB",& ...続きを読む
>この状態(つまり、","を格納していない状態)で、またStringTokenizerのanalyに戻すことってできるのでしょうか?
>配列を指定して文字列を取得するのではなく、できればanaly.nextToken()を使って文字列を所得したいのですが・・・

これって
String[] moji = {"AAA","BBB","CCC"};
とある時に
String str = "AAA,BBB,CCC";
をつくり
StringTokenizer analy = new StringTokenizer(str,",");
analy.nextToken();
として使いたいということですか?

わたしの読解力が足らん性でしょうが質問の意図が半分くらいしか理解できてぬ故、補足してくだされ。
補足コメント
mune

お礼率 13% (21/151)

なるほど。
String[] moji = {"AAA","BBB","CCC"};
配列をつなげるプログラム;
String str = "AAA,BBB,CCC";
StringTokenizer analy = new StringTokenizer(str,",");
そうすればできますね。
でも、もしかして配列に空文字""が入っていたら、同じことの繰り返しになってしまうのでしょうか!?
投稿日時 - 2001-03-28 10:22:36
  • 回答No.9
レベル9

ベストアンサー率 30% (25/83)

>でも、もしかして配列に空文字""が入っていたら、同じことの繰り返しになってしまうのでしょうか!? そのとおりです。 ただし、" "のように空白が一つでもあれば文字列として認識されます。 String[] moji = {"AAA"," ","CCC"}; とある時に String str ...続きを読む
>でも、もしかして配列に空文字""が入っていたら、同じことの繰り返しになってしまうのでしょうか!?

そのとおりです。
ただし、" "のように空白が一つでもあれば文字列として認識されます。
String[] moji = {"AAA"," ","CCC"};
とある時に
String str = "AAA, ,CCC";
をつくり
StringTokenizer analy = new StringTokenizer(str,",");
analy.nextToken();

"AAA"
" "
"CCC"
を取得することは出来ます。

したがって、最初のプログラムで
moji2[n2]=null; 若しくは、moji2[n2]="";
としたところを
moji2[n2]=" ";
とすれば文字列として明示的に取得することが出来ますがいかがでしょうか?
  • 回答No.2
レベル9

ベストアンサー率 30% (25/83)

>第1トークンaaa >第2トークン >第3トークンbbb >といった具合にするには、やはり独自に細かいプログラムを作成しなければいけないのでしょうか・・・ 作成しなければならないでしょうね。 作成のしかたはわかりますか? わからなければ、お手伝いいたしますので補足してください。 ...続きを読む
>第1トークンaaa
>第2トークン
>第3トークンbbb
>といった具合にするには、やはり独自に細かいプログラムを作成しなければいけないのでしょうか・・・

作成しなければならないでしょうね。
作成のしかたはわかりますか?
わからなければ、お手伝いいたしますので補足してください。
補足コメント
mune

お礼率 13% (21/151)

ちょっとわからないので、あまえてもよろしいでしょうか?
投稿日時 - 2001-03-27 13:35:28
  • 回答No.3
レベル9

ベストアンサー率 30% (25/83)

xinman再びです。 補足、拝見しました。こんなんでどう? ・ ・ line = csvfile.readLine(); StringTokenizer analy = new StringTokenizer(line,",",true); String[] moji1 = null; String[] moji2 = null; int analy_cou ...続きを読む
xinman再びです。
補足、拝見しました。こんなんでどう?



line = csvfile.readLine();
StringTokenizer analy = new StringTokenizer(line,",",true);
String[] moji1 = null;
String[] moji2 = null;
int analy_count = analy.countTokens();
int moji_count = 1;

moji1 = new String[ analy_count ];
for (int n=0; n<moji1.length; n++){
moji1[n] = analy.nextToken();
if(moji1[n].equals(","))moji_count++;
}
moji2 = new String[ moji_count ];
for (int n1=0,n2=0; n2<moji_count; n2++){
if(n1>=moji1.length){
moji2[n2] = null;
}else if(moji1[n1].equals(",")){
moji2[n2] = null;
}else {
moji2[n2] = moji1[n1];
n1++;
}
n1++;
}



この場合、moji2に結果が格納されます。
お礼コメント
mune

お礼率 13% (21/151)

ありがとうございます。
まだ試してはいないのですが、これでできそうです。
ついでにもう一つ質問させてください。
この状態(つまり、","を格納していない状態)で、またStringTokenizerのanalyに戻すことってできるのでしょうか?
配列を指定して文字列を取得するのではなく、できればanaly.nextToken()を使って文字列を所得したいのですが・・・
投稿日時 - 2001-03-27 16:42:50
  • 回答No.4
レベル9

ベストアンサー率 30% (25/83)

xinmanです。 間違いました。 下の回答は自信ありでお願いします。
xinmanです。
間違いました。
下の回答は自信ありでお願いします。
  • 回答No.5
レベル9

ベストアンサー率 30% (25/83)

xinman先答の補足です。 とりあえずカンマとカンマの間の文字列は moji2[n2]=null; としてnullを格納しておきましたが 長さ0の文字列の方が都合がよければ moji2[n2]=""; としてください。 書き換える場合は、2箇所に記述してあるので忘れ無いように。 ...続きを読む
xinman先答の補足です。
とりあえずカンマとカンマの間の文字列は
moji2[n2]=null;
としてnullを格納しておきましたが
長さ0の文字列の方が都合がよければ
moji2[n2]="";
としてください。
書き換える場合は、2箇所に記述してあるので忘れ無いように。
お礼コメント
mune

お礼率 13% (21/151)

試してみました。完璧です!ありがとうございました。
下のもう一つの質問はいかがでしょうか・・・
投稿日時 - 2001-03-27 17:12:06
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ