
お世話になります。Java初心者です
Javaプログラムを実行する同じディレクトリにあるテキストファイルとデータファイルをコマンドラインで同時に読み込み
それぞれ違う配列に格納したいのですが、1つのファイルの読み込みは出来ても2つ同時の読み込みと配列格納でつまづいています。
読み込むテキストファイルには以下のような1行の文が、
Dr. Fujita is great!
読み込むデータファイルには以下のような文字が書かれています。
AC 4C 7C 10C KC 3D 6D 9D QD JB 3C 6C 9C QC 2D 5D 8D JD JA 2C 5C 8C JC AD 4D 7D 10D KD
配列に格納する際、テキストファイルの場合は全て大文字にし、アルファベット以外の記号(スペース含)は全て消して配列に格納します。
上の例でいえばこのような状態で格納です↓
DRFUJITAISGREAT
データファイルの場合は、2組1文字をそのまま配列に格納です。ただしスペースは飛ばします。
上の例でいえば、ACを配列0に、4Cを配列1に、7Cを配列2に、、、と格納していきます。
import java.io.*;
public class sample{
public static void main(String[] args){
try{
FileReader f = new FileReader(args[0]);
BufferedReader b = new BufferedReader(f);
Strings;
while((s=b.readLine())!=null){
System.out.println(s); ←読み込んでるか確認
}
}catch(Exception e){
System.out.println(no file);
}
}
}
ファイルの指定は実行時に、java sample datafile.dat textfile.txt と指定します。
読み込むプログラムは以上のように書いたのですが、2つファイルを読み込むにはどのように記述したらよいのでしょうか。
FileReaderを2つ作成?しても最初に指定したデータファイルの内容がまた読み込まれるだけで・・・
読み込んだら変数sに入りますが、たとえばs.substring()なんかでわけて配列に入れようとしても、s.substring()←ここでエラーが出てしまいます。
あと、Dr. Fujita is great!のアルファベットを大文字にし、記号(スペース含)を飛ばして格納するにはどうしたらよいのでしょうか。
宜しくお願いします
No.2ベストアンサー
- 回答日時:
まずコンパイルエラーの対処方法ですが
>System.out.println(no file);
ここはno fileという文字列を標準出力したいのでしょうか?
そうであれば、no fileを"no file"の様に""で囲んであげてください。
>String[] da = s.split("\\s+"); ←ここのsでエラー。変数sが見つけられないと出ます・・・
>s2 = s2.toUpperCase(); ←ここのs2でエラー。sと同じエラーです
>String[] ta = s2.split("[^A-Z]+"); ←ここのs2でエラー
変数sとs2がスコープ切れしています。
ローカル変数のスコープは宣言したブロックの内側で、宣言した行以降で有効です。
ですので、try{~}の中の処理に続けて記述してやれば良いと思います。
ですが、それでコンパイルが通っても、以下の記述に問題があるので、恐らく実行時例外がおきます。
>while((s=b.readLine())!=null){
>}
>while((s2=b2.readLine())!=null){
>}
このやり方ではwhileブロック終了後のsとs2は常にnullになります。
よって、後のsplitメソッドを呼ぶ段でNullPointerExceptionがスローされるはずです。
ファイルの内容を一行取得するだけであれば、whileを使う必要は無いです。
改行文字を含んでいる場合を考慮する必要があるならば、それならそれで、もう少し工夫が必要です。
以上です。
ご指摘の通り直したらできました!ありがとうございました!
実はもう一つ、ファイルの書き込みでつまづいています。
もしよろしければご教授ください。
本当にありがとうございました!
No.1
- 回答日時:
>読み込むプログラムは以上のように書いたのですが、2つファイルを読み込むにはどのように記述したらよいのでしょうか。
>FileReaderを2つ作成?しても最初に指定したデータファイルの内容がまた読み込まれるだけで・・・
ソースの中で
FileReader f = new FileReader(args[0]);
としている箇所がありますが、
String[] argsの中にはコマンドライン引数として渡された文字列が空白文字区切りで区切られて格納されます。
>ファイルの指定は実行時に、java sample datafile.dat textfile.txt と指定します。
この場合ですと、
args[0] =>datafile.dat
args[1] =>textfile.txt
という風に格納されているという事ですね。
ファイルの読み込みに関してはその辺りを考慮して少し修正を加えれば問題無いと思います。
読み込んだ文字列を配列に格納する方法に関してですが、
簡単な実装方法としては文字列をStringクラスのsplitメソッドで分割してやるという方法があります。
<例>
//datafile.dat
String df = "AC 4C 7C 10C KC 3D 6D 9D QD JB 3C 6C 9C QC 2D 5D 8D JD JA 2C 5C 8C JC AD 4D 7D 10D KD";
//1文字以上連続する空白文字を区切り文字とみなして正規表現で分割して配列に格納
String[] da = df.split("\\s+");
//textfile.txt
String tf = "Dr. Fujita is great!";
//大文字に変換
tf = tf.toUpperCase();
//1文字以上連続するアルファベット以外の文字を区切り文字とみなして正規表現で分割して配列に格納
String[] ta = tf.split("[^a-zA-Z]+");
以上です。
この回答への補足
ありがとうございます。ファイルの読み込みとsplitメソッド非常に参考になりました!
しかしファイルを読み込んでも配列に格納のところでエラーが出てしまいます。
String s;
while((s=b.readLine())!=null)
この記述だと、sに"AC 4C 7C 10C KC 3D 6D 9D QD JB 3C 6C 9C QC 2D 5D 8D JD JA 2C 5C 8C JC AD 4D 7D 10D KD"が代入されたことになるのですよね?
つまりmiyajima24さんの例で言えばsがString df と同じですよね。
なので、splitでわけるために、String[] da = s.split("\\s+");と記述したのですが、
s.splitのsの部分でエラーがでます。sはStringで定義しているのでmiyajima24さんのString df と同じはずなのですが・・・
import java.io.*;
public class sample{
public static void main(String[] args){
try{
FileReader f = new FileReader(args[0]);
FileReader f2 = new FileReader(args[1]);
BufferedReader b = new BufferedReader(f);
BufferedReader b2 = new BufferedReader(f2);
String s, s2;
//data fileの読み込み
while((s=b.readLine())!=null){
}
//text fileの読み込み
while((s2=b2.readLine())!=null){
}
}catch(Exception e){
System.out.println(no file);
}
String[] da = s.split("\\s+"); ←ここのsでエラー。変数sが見つけられないと出ます・・・
s2 = s2.toUpperCase(); ←ここのs2でエラー。sと同じエラーです
String[] ta = s2.split("[^A-Z]+"); ←ここのs2でエラー
}
}
なぜこのsでエラーが出るのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける 3 2022/09/10 07:55
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#】ハッシュテーブル(連想...
-
C#で動的配列Listの中身をListB...
-
JavaBeansの配列の値取得方法に...
-
main(String[] args) の args...
-
JavaのBase64デコードで正しく...
-
jspでの二次元配列
-
Javaで文字と数字が混ざったも...
-
多次元配列のソート
-
Javaで文字を漢字であるか否か...
-
『args[]』とは?
-
java StringとString[]の違い
-
String型をbyte型へ
-
サーブレットで複数値の受取り
-
javaについて
-
C言語でunsigned char配列を連...
-
int配列をbyte配列に変換
-
javaで素数を探すプログラム。
-
char string[100]; int c, i=0;...
-
javaでデータベース(mysql)か...
-
正規表現について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javaで文字と数字が混ざったも...
-
C#で動的配列Listの中身をListB...
-
この警告はどうすれば?
-
[Ljava.lang.Stringってなんですか
-
javaで大容量テキストファイル...
-
ArrayListからBean配列に値をセ...
-
C言語でunsigned char配列を連...
-
main(String[] args) の args...
-
配列の中に複数存在する数がい...
-
javamailで複数人にメールを送...
-
【C#】ハッシュテーブル(連想...
-
Javaで文字を漢字であるか否か...
-
同じ配列またはクラスを、2回...
-
セッションを使ったint型の値の...
-
hit&blow
-
sqlparamaterでIN句を使いたい。
-
n番目に大きな値を探索する
-
配列で、値の入っている要素数...
-
データベースから取得したデー...
-
JavaのBase64デコードで正しく...
おすすめ情報