質問: filereader.read()) != -1) { System.out.print((char) data); } //ファイルクローズ filereader.close(); } else { System.out.print("ファイルは存在しません"); } } catch (IOException e) { e.printStackTrace(); } } } ``` ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) テキストファイルの中身 1行目 10:30:50 fas ghd #dasfs fdsf herge %#das 2行目 12:42:43 1 2 432 geds 41 gds!!# 3行目 14:32:31 abb sa 4vs dss23 123 fs2 実現したいcsv形式 1行目 10:30:50 fas #dasfs %#das 2行目 12:42:43 1 432 gds!!# 3行目 14:32:31 abb sa fs2 のような形です。 よろしくお願いします。
回答: > > txtファイル(パスを変数x、ファイル名をyとする)を読み込み、列に特定の文字を含む行を読み飛ばし > > 尚且つ読み込んだ後に特定の列を指定して抽出してcsv(エクセルファイル)としたい > > > サンプルで提示された空白区切りのテキストファイルをCSVファイルにするというところは理解できますが、特定文字を含む行の読み飛ばしについては条件が不明なので、適当に決めた文字を含まない行に対して指定された列からCSVを作るというところまで書いてみました。 * 文字列に指定した文字が含まれるか String#contains * 文字列から区切り文字で分割した配列を作る String#split * 文字列配列から区切り文字で結合した文字列を作る String#join この3つが肝です。 ファイルから1文字ずつ読み出すのは今回の処理ではあまり向かないと思いますので行単位での読み出しにしてJava8っぽい記述にしてみました。 ``` // 仮に決めた不要な行と判断する文字 String ignoreChar = "%"; // 仮に決めた出力対象の列 但し先頭列を0とする int[] index = {0,2,4,6}; String filePath = "/Users/Shared/java/java.txt"; if (Files.exists(Paths.get(filePath))) { try (Stream stream = Files.lines(Paths.get(filePath), StandardCharsets.UTF_8)) { stream.forEach(line -> { if (!line.contains(ignoreChar)) { // 文字列を空白区切りで配列に変換する String[] columns = line.split("\\s+", 0); // このような配列になる // [10:30:50, fas, ghd, #dasfs, fdsf, herge, %#das] // 指定した列のみ出力するために先に決めていたindexで指定された列で配列を作り直す String[] filterd = { columns[index[0]], columns[index[1]], columns[index[2]], columns[index[3]], }; // 文字列配列をカンマ区切りの文字列に変換する String csvRow = String.join(",", filterd); System.out.println(csvRow); } }); } catch (IOException e) { e.printStackTrace(); } } else { System.out.print("ファイルは存在しません"); } } ```