ある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();
}

このQ&Aに関連する最新のQ&A

A 回答 (11件中11~11件)

java.util.StringTokenizer ですよね?


インスタンスを作成するときに以下のコンストラクタを使ってみて下さい。
public StringTokenizer(String str,String delim,boolean returnTokens)

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

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

この方法を使えば、件の目的は果たせるのでは無いでしょうか?

参考URL:http://java.sun.com/j2se/1.3/docs/api/java/util/ …
    • good
    • 0
この回答へのお礼

早速ありがとうございます。
trueを指定して試してみたのですが、区切り文字も入ってしまうのですね。
第1トークンaaa
第2トークン
第3トークンbbb
といった具合にするには、やはり独自に細かいプログラムを作成しなければいけないのでしょうか・・・

お礼日時:2001/03/27 10:20

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

QEclipseでのJDBCドライバについて

Eclipse3.1でデータベース(mysql)にアクセスするプログラムを作ったのですが下記のエラーが出ます。

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

これはJDBCドライバのセットアップがうまく出来ていないからなのでしょうか?
またEclipseでは、~.jarというファイルをプロジェクトのWEB-INFのlibフォルダに入れれば使える印象があるのですが、参考書(EclipseのではなくJAVAなどの)などにあるようにTomcatのインストールフォルダ以下common/libに入れて環境変数を変更しないといけないのでしょうか?

ご存知の方教えてください、よろしくお願いします。

Aベストアンサー

WEB-INF以下に入れると実行はできるのですが、エクリプスが.javaファイルをコンパイルすることができません。projectの一覧を右クリックしてpropertyを選択し、ダイアログ右側からJava Build Pathを選択し、タグからLibrariesを選び、Add JARsボタンをおして.jarファイルを登録して下さい。
たぶんこれでコンパイルできるはずです。

Q数字か文字列かを判定する関数

 JAVAの初心者です、宜しくお願いします。
  
 テキストボックスに入力された値を、数字か文字列かを判定する関数ってありますか、VBでは「isNumeric」とかがあるのですが、JAVAではヒットしませんでした。

 どこからどのように調べるのでしょうか。
 いいサイトがあれば教えて下さい。

Aベストアンサー

・ たとえば、整数か文字列かの場合、クラスIntegerのparseInt(String s)メソッドを使い、例外(NumberFormatException)が発生するかどうかで判断します。

以下のコードを参考にしてみてください。
------------------------------------------------------------
public class ParseIntSample {

public static void main(String[] args) {
System.out.println(isInteger("123"));
System.out.println(isInteger("123A"));
}

static boolean isInteger(String num) {
try {
int n = Integer.parseInt(num);
return true;
} catch (NumberFormatException e) {
return false;
}
}
}
------------------------------------------------------------
結果
true
false
------------------------------------------------------------
実数の場合は、Double.parseDouble(String s)があります。
これも、例外(NumberFormatException)を発生します。

・ たとえば、整数か文字列かの場合、クラスIntegerのparseInt(String s)メソッドを使い、例外(NumberFormatException)が発生するかどうかで判断します。

以下のコードを参考にしてみてください。
------------------------------------------------------------
public class ParseIntSample {

public static void main(String[] args) {
System.out.println(isInteger("123"));
System.out.println(isInteger("123A"));
}

static boolean isInteger(String num) {
try {
int n = Integer.parse...続きを読む

Q文字列からダブルクオートの削除

お世話になります、

CSVからデータを取得してDBに書き込む処理を行っているのですが、CSVデータで型が文字のものはダブルクオート(")でくくっています。
(例)
"りんご",100,"円"
"ばなな",200,"ドル"

このままデータをStringTokenizerクラスを使用して取得した場合りんごは("りんご")のようにダブルクオートがついた状態で取得されてしまいます。
ダブルクオートを取り外す方法またはメソッドを教えていただきたいのですが、よろしくお願いします。

Aベストアンサー

以前作成した1行文字列をフィールド分割する関数ソースを載せておくので
参考にしてください。
もっといい方法があるのかもしれませんが、とりあえずここでは
一文字ずつ呼んでダブルクオートを削除し、又ダブルクオート内の
カンマはそのまま文字として使用するようにしてます。
面倒だったので文字内にダブルクオートを使用することは考慮に入れてません(^^;

ArrayList parsLine(String line){
 ArrayList fields = new ArrayList();
 if(line == null) return;
 boolean isQuort = false; //ダブルコーテーション内フラグ
 StringBuffer field = null;
 for(int i=0;i<line.length();i++){
  char code = line.charAt(i);
  if(isQuort){
//ダブルクオート内
   if(code == '\"'){
    isQuort = false;
   }
   else{
    if(field == null) field = new StringBuffer();
    field.append(code);
   }
  }
  else{
//ダブルクオート外
   if(code == '\"'){
    isQuort = true;
   }
   else if(code == ','){
    if(field == null) field = new StringBuffer();
    fields.add(field.toString());
    field = null;
   }
   else{
    if(field == null) field = new StringBuffer();
    field.append(code);
   }
  }
 }

 if(field != null){
  fields.add(field.toString());
 }
 return fields;
}

以前作成した1行文字列をフィールド分割する関数ソースを載せておくので
参考にしてください。
もっといい方法があるのかもしれませんが、とりあえずここでは
一文字ずつ呼んでダブルクオートを削除し、又ダブルクオート内の
カンマはそのまま文字として使用するようにしてます。
面倒だったので文字内にダブルクオートを使用することは考慮に入れてません(^^;

ArrayList parsLine(String line){
 ArrayList fields = new ArrayList();
 if(line == null) return;
 boolean isQuort = false; //ダ...続きを読む

QCSVファイルの中で、「 , 」カンマを使いたい

「 , 」で区切られたCSVファイルの中で、「 , 」カンマを使いたいのですが、可能でしょうか?

具体的には「これは1,500円でした。」というように、CSVファイルに収められた文章内で出てくる半角の数字(お金)の区切りに使いたいのです。
全角では代用したくないのですが、CSVファイルでデータを受け渡しする際に、困っています。

例えば、特殊文字などで対応可能でしょうか?

Aベストアンサー

受け渡しに使うと言うことは相手方のアプリケーションのことも考えなければいけないのですが・・・とりあえず対応が簡単そうな方法を。

1.各セルを""で囲む。(もちろんデータにダブルクォートがある場合はカンマと同様に困ります。
2.カンマで区切らずにタブで区切る。(比較的使われない文字ですが、やはりデータ中にタブがあるとカンマと同様です)

難しいけれど完璧に対応するためには、データ中の区切り文字は特殊な文字列に変更し、受け取り側のアプリケーションではその特殊な文字列をデータ中の区切り文字として扱うという方法が使われます。
例えば、データ中のカンマは\,にするとか。

データ作成側、受け取り側でそれぞれどこまで対応できるのか分かるともっと簡単かつ具体的な方法を回答できるかも知れません。

Q多次元配列のソート

過去に同様の質問があったのですが、未回答でしたので質問させていただきます。

多次元配列のうちの一つの列の値でソートし、その他の列にも結果を連動させたいのですが方法が分かりません。

たとえば、a[n][m]という配列で
a[0][0]=C a[0][1]=う         a[0][0]=A a[0][1]=あ
a[1][0]=A a[1][1]=あ   →    a[1][0]=B a[1][1]=い
a[2][0]=B a[2][1]=い         a[2][0]=C a[2][1]=う

というように、n列でソートしm列でもその結果で並べ替えたいです。

恐らくComparatorインタフェースを使用すると可能かと思うのですが、方法を教えて頂けないでしょうか。

Aベストアンサー

wo-007さん、こんにちは。
Comparatorインタフェースまで気づいていらっしゃるだけに惜しいですね。そのインタフェースの実装の仕方さえわかれば、あとqazwsxeさんの回答にもあるArraysクラスのsortメソッドを使えば簡単にソートができます。
いかにサンプルを示します。
public class MultiArraySortTest {

public static void main(String[] args) {
// String配列の配列を用意します。
String[][] testArray = new String[][] {
{"B", "1"},
{"A", "2"},
{"C", "3"},
{"A", "4"}
};

// 各String配列をソートします。
Arrays.sort(testArray, new StringArrayComparator());

// ソート結果を表示します。
for ( int i = 0; i < testArray.length; i++ ) {
for ( int j = 0; j < testArray[i].length; j++ ) {
System.out.print( "[" + testArray[i][j] + "]" );
}
System.out.println();
}
}

}

/**
* String配列を比較するクラス。<br>
*/
class StringArrayComparator implements Comparator {
/**
* 渡されたオブジェクトを比較します。<br>
* このメソッドでは、2つの引数ともString配列であることを期待し、
* キャストした上、compare(array1, array2)を呼び出します。<br>
* よって、どちらかがString配列ではない場合、ClassCastExceptionをスローします。
* @param o1 比較するString配列オブジェクトその1。
* @param o2 比較するString配列オブジェクトその2。
* @return o1がo2より小さい場合は負の値を、
* o1がo2と等しい場合は0を、
* o1がo2より大きい場合は正の値を、戻します。
* @throws ClassCastException o1、o2いずれかがString配列ではない場合。
* @see #compare(String[], String[])
*/
public int compare(Object o1, Object o2) {
int returnVaule = 0;
returnVaule = compare((String[])o1, (String[])o2);
return returnVaule;
}

/**
* 渡されたString配列を比較します。<br>
* 引数で渡されたString配列の0番目要素(先頭要素)を比較し、
* その結果をそのまま戻します。
* @param array1 比較するString配列オブジェクトその1。
* @param array2 比較するString配列オブジェクトその2。
* @return array1がarray2より小さい場合は負の値を、
* array1がarray2と等しい場合は0を、
* array1がarray2より大きい場合は正の値を、戻します。
*/
public int compare(String[] array1, String[] array2) {
int returnVaule = 0;
returnVaule = array1[0].compareTo(array2[0]);
return returnVaule;
}
}

本来のこのように答えを書くのはいけないのかもしれませんが、今回の質問はAPIに対する知識の差だけですので、あえて書きました。あとはこの内容を応用して、昇順ではなく降順にも対応するにはどうすればよいか、0番目以外の要素でソートするにはどうすればよいか、X番目、Y番目の組み合わせでソートするにはどうすればよいか、など応用した方法を考えていただければと思います。

wo-007さん、こんにちは。
Comparatorインタフェースまで気づいていらっしゃるだけに惜しいですね。そのインタフェースの実装の仕方さえわかれば、あとqazwsxeさんの回答にもあるArraysクラスのsortメソッドを使えば簡単にソートができます。
いかにサンプルを示します。
public class MultiArraySortTest {

public static void main(String[] args) {
// String配列の配列を用意します。
String[][] testArray = new String[][] {
{"B", "1"},
{"A", "2"},
{"C", "3"},
{"A", "4"}
};

// 各Strin...続きを読む

QJSP/Servlet DBからデータを読み込み、CSV形式でダウンロードさせる・・・・

まず、あるボタンをおすと、Servletに飛ばして、そこでDBから特定のデータを読み込んで、読み込んだデータをカンマ区切りにして、ダウンロードさせます。
そして、ダウンロード直後にそのファイルを開かせないで、ダウンロードした人が任意の場所にファイルを保存させたいのです。 

ダウンロード自体はできているのですが、どうしてもダウンロード直後にエクセルファイルでひらいてしまい、任意の場所に保存させることができません。Officeの入っていないPCなら任意の場所に保存させられるようなのですが・・・・。

解決案をお待ちしております。

Aベストアンサー

resp.setHeader("Content-Disposition", "attachment; filename=\"tets.csv\"");

Servlet でこの一行を入れてみてはどうですか?
JSPはこの場合、関係ないですよね?
多分、attachment; が開かない様にしてくれたかと思うんですが。。。

適当です。間違っていたらすみません。

QsetAttribute getAttribute 配列内容受け渡し  について 

こんいちは。
setAttributeでセットした値をgetAttributeを使用して表示したいのですがうまくいきません。

あとsession.setAttributeとrequest.setAttributeの違いがわかりません。
session はなんとなくわかるのですが、requestがいまひとつわかりません。

どなたか教えていただけないでしょうか?
よろしくお願いいたします。

下記がコーディングの内容です。

test.jsp

<%@ page contentType="text/html;charset=Shift_JIS"
import="java.sql.*, java.util.*" %>
<%

String[] desc={"aaa","bbb","ccc","ddd","eee"};
session.setAttribute("desc",desc);

Vector vect = (Vector)session.getAttribute("dpt");

Iterator itr = vect.iterator();

while(itr.hasNext()) {
String[] temp = (String[])itr.next();

out.println(temp[0]);
out.println(temp[1]);
}
%>
<html>
<body>
t_3 test
</body>
</html>

こんいちは。
setAttributeでセットした値をgetAttributeを使用して表示したいのですがうまくいきません。

あとsession.setAttributeとrequest.setAttributeの違いがわかりません。
session はなんとなくわかるのですが、requestがいまひとつわかりません。

どなたか教えていただけないでしょうか?
よろしくお願いいたします。

下記がコーディングの内容です。

test.jsp

<%@ page contentType="text/html;charset=Shift_JIS"
import="java.sql.*, java.util.*" %>
<%

String[] ...続きを読む

Aベストアンサー

String[] desc={"aaa","bbb","ccc","ddd","eee"};
session.setAttribute("desc",desc);

Vector vect = (Vector)session.getAttribute("dpt");

Iterator itr = vect.iterator();


うまくいくわけがないですね。

String[]
型で格納したんだから。
受け取る時も、
String[]
型でキャストしないと無理です。
なぜ
Vectorでキャストするのでしょうか?

それに格納するときの
キー値が
"desc"
になっていて
どうして、
取得する時キー値が
"dpt"
にしているのでしょうか?


requestは
Httpプロトコルでいうところの1つセッション
をあらわすオブジェクトをサーブレットコンテナ
が実装したものです。

session
はブラウザのプロセスに対応する
セッションIDと該当するHttpSession
オブジェクトをサーブレットコンテナ側で
生成して、
一定期間存続させることで、
あたかも、セッションが確立させしているように
Http上でみせかけるための
しくみを提供するものです。

詳細は調べてください。

以上

String[] desc={"aaa","bbb","ccc","ddd","eee"};
session.setAttribute("desc",desc);

Vector vect = (Vector)session.getAttribute("dpt");

Iterator itr = vect.iterator();


うまくいくわけがないですね。

String[]
型で格納したんだから。
受け取る時も、
String[]
型でキャストしないと無理です。
なぜ
Vectorでキャストするのでしょうか?

それに格納するときの
キー値が
"desc"
になっていて
どうして、
取得する時キー値が
"dpt"
にしているのでしょうか?


request...続きを読む

QStringTokenizerを使用して、連続した区切り文字を見分ける方法

文字列を改行コードごとに区切り、Vectorに格納していきたいと思っています。

例)
あ\r\nい\r\nう\r\nえ\r\nお\r\n という文字列を
「あ・い・う・え・お」と分けてVectorに格納する。


そこで、改行コードが連続してきた場合に「連続して改行コードがきた!!」ということが分かるようにVectorに格納したいと思っています。

例)
あ\r\nい\r\nう\r\nえ\r\n\r\nお\r\n という文字列が来たら、「あ・い・う・え・☆・お」のような感じで、
連続して改行コードが来たら、何か特定の文字を詰めるなど。

どなたかいい方法を教えてください。
よろしくお願いします。

Aベストアンサー

大雑把なコードですけど (^^;
改行コードですからStringTokenizerよりもBufferedReaderを使ってみました。

String fix="";
String str="あ\r\nい\r\nう\r\nえ\r\n\r\nお\r\n";
try{
  BufferedReader br=new BufferedReader(new StringReader(str));
  String s="";
  while((s=br.readLine())!=null){
    if("".equals(s)){
      fix=fix+"☆";
    }
    else{
      fix=fix+s;
    }
  }
}
catch(IOException e){
}
System.out.println(fix);

Q文字列から数字を取り出す方法

質問があります。
例えば、テキストファイルから文章を一行ずつ読み込み、それをString型の変数に格納していきます。
その文から数字(整数で、何桁かはわからない。)を取り出し(ちなみにその数字の前後には特定の文字がついています)、変数に格納するというプログラムを作りたいのですが、具体的な方法がわかりません。
よろしければ是非教えてください!

Aベストアンサー

こんな感じですか?
数値以外を除きそのまま代入させます

String str = "ABCDABCD1234512345abcd";
int ret = Integer.parseInt(str.replaceAll("[^0-9]",""));
System.out.println(ret); //結果表示


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング