![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
ある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();
}
・
・
No.10
- 回答日時:
xinmanです。
こんなのもありかな?
moji2[n2]=" ";
の方を使って
String[] moji = {"AAA"," ","CCC"};
とある時に
String str = "AAA, ,CCC";
をつくり
StringTokenizer analy = new StringTokenizer(str,",");
analy.nextToken().trim();
で
"AAA"
""
"CCC"
を取得することは出来ます。
プログラムで空白を付け足しても、trim()で削除することで空の文字列を作れます。
この場合は、最初から入っていた空白も削除されますんで、その辺は注意が必要です。
この回答への補足
ありがとうございます。
ちなみに、文字列操作関数(?)のtrim()って文字列両端の空白文字を削除する関数ですか??
他の言語でlefttrim()、righttrim()っていうのは使ったことがあるのですが・・・
ボクのjavaの参考書にはtrim()関数の説明がのっていない!!
No.9
- 回答日時:
>でも、もしかして配列に空文字""が入っていたら、同じことの繰り返しになってしまうのでしょうか!?
そのとおりです。
ただし、" "のように空白が一つでもあれば文字列として認識されます。
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.8
- 回答日時:
>この状態(つまり、","を格納していない状態)で、またStringTokenizerのanalyに戻すことってできるのでしょうか?
>配列を指定して文字列を取得するのではなく、できればanaly.nextToken()を使って文字列を所得したいのですが・・・
これって
String[] moji = {"AAA","BBB","CCC"};
とある時に
String str = "AAA,BBB,CCC";
をつくり
StringTokenizer analy = new StringTokenizer(str,",");
analy.nextToken();
として使いたいということですか?
わたしの読解力が足らん性でしょうが質問の意図が半分くらいしか理解できてぬ故、補足してくだされ。
この回答への補足
なるほど。
String[] moji = {"AAA","BBB","CCC"};
配列をつなげるプログラム;
String str = "AAA,BBB,CCC";
StringTokenizer analy = new StringTokenizer(str,",");
そうすればできますね。
でも、もしかして配列に空文字""が入っていたら、同じことの繰り返しになってしまうのでしょうか!?
No.7
- 回答日時:
xinmanです。
ばらばらと、まとまりの無い回答で申し訳ありません。m(__)m
StringTokenizerについての補足です。
原則的にStringTokenizerは一度読み込んだら終わり的な、使い捨てのClassです。プログラムで使用するときも再利用は出来ないのでそのつもりで使いましょう。
(宣言したクラス変数は新しいStringTokenizerオブジェクトを割り当てることで利用できます)
先答の訂正:StriongはStringの誤りです。ゴメンナサイ。
No.6
- 回答日時:
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.3
- 回答日時:
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に結果が格納されます。
ありがとうございます。
まだ試してはいないのですが、これでできそうです。
ついでにもう一つ質問させてください。
この状態(つまり、","を格納していない状態)で、またStringTokenizerのanalyに戻すことってできるのでしょうか?
配列を指定して文字列を取得するのではなく、できればanaly.nextToken()を使って文字列を所得したいのですが・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- PHP 空文字 "" ですが 空文字の意味を教えてください。 3 2022/08/05 03:51
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- Visual Basic(VBA) 【VBA】特定の文字で改行(次の行)に行きたい。 3 2022/04/11 17:20
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Javaについて質問します。
-
インデックスソート
-
Stringの文字列に配列の値を追...
-
cloneメソッドについて (java)
-
配列で、値の入っている要素数...
-
String型をbyte型へ
-
Javaで文字と数字が混ざったも...
-
n番目に大きな値を探索する
-
配列の中に複数存在する数がい...
-
csvファイルを2次元配列に格納
-
Javaの構文について
-
CSVファイルを多次元配列に格納...
-
配列
-
C言語でunsigned char配列を連...
-
javaで大容量テキストファイル...
-
[Ljava.lang.Stringってなんですか
-
javaプログラミングでのかぶっ...
-
拡張for文について質問
-
2次元配列とじゃんけんアルゴ...
-
java enum
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
n番目に大きな値を探索する
-
この警告はどうすれば?
-
[Ljava.lang.Stringってなんですか
-
Javaで文字を漢字であるか否か...
-
配列をセッションに割り当てた後で
-
配列の中に複数存在する数がい...
-
java
-
Javaで文字と数字が混ざったも...
-
C#で動的配列Listの中身をListB...
-
配列で、値の入っている要素数...
-
『args[]』とは?
-
【C#】ハッシュテーブル(連想...
-
ページング
-
セッションを使ったint型の値の...
-
配列について
-
同じ配列またはクラスを、2回...
-
ArrayListからBean配列に値をセ...
-
Java配列の問題を教えてくださ...
-
java 大文字と小文字を入れ替える
-
同じ文字を探しカウントしたい
おすすめ情報