質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

1回答

2107閲覧

Javaでcsvファイルを読み込み、読み込んだ配列の行列を入れ替えて、新たなcsvファイルを生成したいです。

luke_account

総合スコア3

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

2クリップ

投稿2021/06/26 17:00

前提・実現したいこと

Javaでcsvファイルを読み込み、読み込んだ配列の行列を入れ替えて、新たなcsvファイルを生成したいです。
コンパイルまでは成功していますが、うまくファイルを生成することができません。
下記のようなエラーが出てしまいます。

発生している問題・エラーメッセージ

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "str" is null at java.base/java.io.Writer.write(Writer.java:249) at csv2csv.main(csv2csv.java:36)

該当のソースコード

java

1import java.io.*; 2 3public class csv2csv { 4 private final static String inputCsvFile = "csvdata.txt"; 5 private final static String outputCsvFile = "newcsvdata.txt"; 6 7 public static void main(String[] args){ 8 9 String[][] csvArray = new String[6][6]; 10 File inputFile = new File(inputCsvFile); 11 File outputFile = new File(outputCsvFile); 12 BufferedReader in = null; 13 BufferedWriter out = null; 14 try { 15 in = new BufferedReader(new FileReader(inputFile)); 16 out = new BufferedWriter(new FileWriter(outputFile)); 17 String line; 18 int index = 0; 19 20 while ((line = in.readLine()) != null){ 21 csvArray[index] = line.split(","); 22 index++; 23 for(int i=0; i < csvArray[0].length; i++){ 24 for(int j = 0; j < csvArray[i].length; j++) { 25 out.write(csvArray[j][i]); 26 } 27 } 28 out.newLine(); 29 } 30 31 }catch(FileNotFoundException e){ 32 e.printStackTrace(); 33 }catch(IOException e){ 34 e.printStackTrace(); 35 }finally{ 36 try{ 37 in.close(); 38 out.close(); 39 }catch(IOException e){ 40 System.out.println("close fail"); 41 e.printStackTrace(); 42 } 43 } 44 } 45 }

試したこと

現在までに、for分の中の数字を変えてみたり、str is nullとエラー出ていることから、strを定義してみました。

補足情報(FW/ツールのバージョンなど)

macでVScodeを使用しています。
解決方法を教えてください。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

while ループ内の処理を改めて考えてみてください。

String[6][6]とあるので6行6列のCSVを想定

while (inputファイルを一行ずつ処理 6行分なので6回ループ) //一回目の処理 一行目を,で分割して csvArray[0][0]~ csvArray[0][5] に代入 index 1追加 for ループ1 i = 0 ~ 5(csvArray[0] の要素数) for ループ2 j = 0 ~ 5 (csvArray[0]~csvArray[5]の要素数) csvArray[j][i] [0][0] [1][0] [2][0] [3][0] [4][0] … …[0][5] [1][5] [2][5] [3][5] [4][5] 6x6回分の出力 //while1回目の処理では [0][0]~[0][5]にしか読み込データがない

この時点で気づいたかもしれませんが、原因がわからない場合はエラーが起きてそうなところの変数を調べてみましょう。
NullPointerExceptionなので どこかでnullの情報にアクセスしてます。

エラー発生タイミングを特定するため、二重forループ内に以下を追加してみます。

Java

1System.out.println("i:" +i + " j" + j); //追加 2out.write(csvArray[j][i]);

結果

i:0 j0 i:0 j1 Exception in thread "main" java.lang.NullPointerException at java.base/java.io.Writer.write(Writer.java:249) at csv2csv.main(csv2csv.java:33)

i=0 j= 0 ではエラーがでておらず、
i=0 j= 1の後、エラーが起きています。
つまりcsvArray[1][0] ですが、whileの処理をたどればこの時点ではcsvArray[1][0] に読み込んだデータは入っておらず、Stringの初期値のnullが入っています。

ここで実行されているwriteメソッドについて確認してみます。
VSCodeで out.write(csvArray[j][i])writeを選択状態にして、右クリック(MACだとControl + クリック?)してメニューから定義へ移動で、writeの定義が確認できます

java.io.Writerクラスのwrite(String str)メソッドの定義は以下のようになっています。

Java

1 public void write(String str) throws IOException { 2 write(str, 0, str.length()); 3 }

str.lengthで引数の文字列の長さをチェックしていることがわかります。

このことから、nullの長さをチェックしようとして NullPointerException が発生していると思われます。

while内のロジックがそもそも誤っているので、csvArrayへのデータ読み込みと出力のタイミングを意識してソースの修正を考えてみてください。

投稿2021/06/26 20:13

Crimson_Tide

総合スコア509

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

luke_account

2021/06/28 09:48

連絡が遅れてしまい申し訳ございません。 ご回答ありがとうございます! 出力のタイミングを修正することを意識し、修正した結果、for文をwhileの外に移すことで解決することができました。 ありがとうございました! これからも何卒よろしくお願いします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問