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

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回答

1873閲覧

改行を含む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グッド

0クリップ

投稿2021/07/23 16:25

前提・実現したいこと

改行を含むCSVファイルの入力と出力
ここに質問の内容を詳しく書いてください。

現在、CSVファイルを読み込んで、その内容を入れ替えて新たなCSVファイルを出力しようとしています。しかし、CSVファイルのセルの中に改行を含むものがあり、それらをうまく読み込むことができません。また、改行を含むセルは複数回改行をするものがほとんどです。
具体的には、このようなCSVファイルを
イメージ説明
次のように変更できるようにしたいです。
イメージ説明

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

改行された部分を読み込もうとすると、最初の1行しか読みこまれず、それ以降のセルも読み込むことができない状況にあります。

該当のソースコード

java

1import java.io.*; 2 3public class www { 4 private final static String inputCsvFile = "database.csv"; 5 private final static String outputCsvFile = "datashopify.csv"; 6 7 public static void main(String[] args) { 8 final int max_data = 1000; 9 String[][] data = new String[max_data][]; 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 data[index++] = line.split(","); 22 out.newLine(); 23 for (int i = 1; i < data[0].length; i++) { 24 out.write(data[i][0] + ", " + data[i][2] + ", " + data[i][1]); 25 } 26 27 System.out.println(data[1][2]); 28 29 } catch (FileNotFoundException e) { 30 e.printStackTrace(); 31 } catch (IOException e) { 32 e.printStackTrace(); 33 } finally { 34 try { 35 in.close(); 36 out.close(); 37 } catch(IOException e) { 38 System.out.println("close fail"); 39 e.printStackTrace(); 40 } 41 } 42 } 43} 44

試したこと

他の方もこの件に関してteratail等の質問サイトなどで質問していたので、それらと同様にコードを組んでみたりしたのですが、やはりうまくいきませんでした。

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

どなたか教えていただけると幸いです。

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

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

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

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

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

guest

回答1

0

対象の csv ファイルの各行に対し data[index++] = line.split(","); を行っていったら、 data 配列にはどの部分にどんな値が入ることになるのかを紙等に書き出してみては如何でしょうか。

最初の1行しか読みこまれず、それ以降のセルも読み込むことができない

while 文には {} がありませんので、読み込みは全行行われていると思われます。(しかしこの構造は、インデントの付け方からして恐らく意図していない状況と思われます。)
問題は出力の for 文のほうでしょう。

以下では行の管理を Manager クラスが行っています。

java

1import java.io.BufferedReader; 2import java.io.BufferedWriter; 3import java.io.File; 4import java.io.FileReader; 5import java.io.FileWriter; 6import java.io.IOException; 7 8public class Q350945 { 9 10 private static class Manager { 11 private String samples[]; 12 private String lines = ""; 13 Manager(String sample) { 14 samples = sample.split(","); //サンプルを分解して"必要な件数"を求める 15 } 16 String[] getSamples() { return samples; } 17 18 /** 行を溜め込む。必要な件数分溜ったら配列にして返し、溜め込んだデータをクリアする。 */ 19 String[] put(String line) { 20 lines += line; //溜め込み 21 String[] values = lines.split(","); //分解してみる 22 if(values.length == samples.length) { 23 lines = ""; 24 return values; 25 } 26 lines += System.lineSeparator(); 27 return null; 28 } 29 } 30 31 public static void main(String[] args) { 32 try(FileReader r = new FileReader(new File("database.csv")); 33 BufferedReader in = new BufferedReader(r); 34 FileWriter w = new FileWriter(new File("datashopify.csv")); 35 BufferedWriter out = new BufferedWriter(w);) { 36 37 String sample = in.readLine(); 38 Manager m = new Manager(sample); 39 String[] samples = m.getSamples(); 40 out.write(samples[0]+","+samples[2]+","+samples[1]+","); 41 out.newLine(); 42 43 for(String line; (line=in.readLine()) != null; ) { 44 String[] data = m.put(line); 45 if(data != null) { 46 out.write(data[0]+","+data[2]+","+data[1]+","); 47 out.newLine(); 48 System.out.println(data[2]); 49 } 50 } 51 } catch (IOException e) { 52 e.printStackTrace(); 53 } 54 } 55}

database.csv

plain

1Person, info, character, 2"太郎", 3"身長:180cm 4体重:60kg 5学歴:大卒","陽気", 6"二郎", 7"身長:170cm 8体重:50kg 9学歴:高卒","根暗", 10"三郎", 11"身長:160cm 12体重:40kg 13学歴:中卒","真面目",

結果:

plain

1"陽気" 2"根暗" 3"真面目"

datashopify.csv

plain

1Person, character, info, 2"太郎","陽気", 3"身長:180cm 4体重:60kg 5学歴:大卒", 6"二郎","根暗", 7"身長:170cm 8体重:50kg 9学歴:高卒", 10"三郎","真面目", 11"身長:160cm 12体重:40kg 13学歴:中卒",

投稿2021/07/23 18:06

編集2021/07/23 18:16
jimbe

総合スコア13209

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問