51279


**質問者のレベル**  
Javaを勉強し始めて2週間目になります。  
Stackoverflowでの質問は初めてです。

**実現したいこと**  
[![画像の説明をここに入力](https://i.stack.imgur.com/ElkjZ.png)](https://i.stack.imgur.com/ElkjZ.png)

上記のcsvファイルをjavaファイルで読み込み、以下の条件で編集して別ファイルに書き込みたい  
条件  
①D列を削除  
②c列がmの行だけを抽出  
③e列の自然順序付けで行を並び替える  
つまり、以下のように別ファイルに出力したいのです。  
[![画像の説明をここに入力](https://i.stack.imgur.com/yCUT3.png)](https://i.stack.imgur.com/yCUT3.png)

**やったこと、困ってること**  
とりあえずcsvを一行ずつリストに入れたのですが、編集の仕方、リストから別ファイルに書き込む方法がわかりません。  
調べたところ、csvファイルを扱うにはライブラリを使うのが良いらしいのですが、できればライブラリは使いたくありません。  
ほとんど丸投げのような質問になってしまい申し訳ないのですが回答よろしくお願いします。

**該当のソースコード**

[code]

    1 package csvSample;
    2 
    3 import java.io.BufferedReader;
    4 import java.io.File;
    5 import java.io.FileNotFoundException;
    6 import java.io.FileReader;
    7 import java.io.IOException;
    8 import java.util.ArrayList;
    9 import java.util.Arrays;
    10 import java.util.List;
    11
    12
    13 /**
    14 * csvファイルを読み込む練習クラス
    15 * @author beginnerOfLife
    16 *
    17 */
    18 public class CsvSampleMain {
    19
    20    public static void main(String[] args) {
    21        //　読み込んだ内容を格納するためのリスト
    22        List<List<String>> ret = new ArrayList<List<String>>();
    23        try {
    24            File f = new File(FILENAME);
    25            BufferedReader br = new BufferedReader(new
    26                FileReader(f));
    27
    28
    29            //csvファイルから読みこんだデータを格納するString
    30            String line = "";
    31
    32            while((line = br.readLine()) != null) {
    33                //csvの一行を格納するリスト
    34                List<String> tmpList = new ArrayList<String> 
    35();
    36                String array[] = line.split(",");
    37                
    38                //　配列からリストに変換
    39                tmpList = Arrays.asList(array);
    40                //　確認のためリストの内容を出力
    41                System.out.println(tmpList);
    42                //　リストに1行データを格納
    43                ret.add(tmpList);
    44            }
    45            br.close();
    46        } catch (FileNotFoundException e) {
    47            e.printStackTrace();
    48        } catch (IOException e) {
    49            e.printStackTrace();
    50        }
    51    }
    52}
    
[/code]


CC BY-SA 4.0
2018-12-16T14:43:48.110
51267
2018-12-17T02:40:25.460
2018-12-16T19:34:29.520
3068
31479
question
java csv
Javaでcsvファイルを読み込み、編集、別ファイルに書き込みたい


ご提示されたコードでやっていることはcsvファイルを読み込んでリストにデータを格納する処理ですが、これが自力で書いたコードならばインターネットで調べた内容を応用して解決する能力は十分と思います。

エラーが出て動かないコードであっても「`tmpList#remove`で編集したら`UnsupportedOperationException`エラーが出ました」、「ファイル出力の`FileWriter`に`ret`を入れることができません」のような試行錯誤と困っている箇所が分かる質問の方が、適切な回答を得やすいのではないでしょうか。  
さらに丸投げ感がなくなるので、この回答のようなお説教くさい回答が減るという利点もあります。

それはさておき、困っている点について回答いたします。

  1. D列を削除  
提示された出力例では削除されていないようですが、削除する時は`ArrayList`など可変長のリストで`remove`メソッドを使います。  
`Arrays#asList`で得られるのは固定長のリストなので、`remove`メソッドを呼ぶと`UnsupportedOperationException`エラーが発生します。

  2. c列がmの行だけを抽出  
if文を使ってc列がmの行だけをリストに入れると良いでしょう。

  3. e列の自然順序付けで行を並び替える  
`ArrayList#sort`メソッドはラムダ式を使ってソート順を指定できます。

  4. リストから別ファイルに書き込む方法  
「java ファイル出力」と「java リスト csv」をググって両者のコードを足すと解決方法が見えてきます。

老婆心ながら、QAサイトの回答者、閲覧者はコピペで再利用しやすい質問を好みます。(例えば下記のサンプルコードが画像で貼られていたら、書き起こすのが面倒ではありませんか？)  
csvの内容を画像ではなくテキストで記述し、コードの行数は削除する方が良い質問になりますので、ご参考まで。

[code]

    package csvSample;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.io.FileWriter;
    import java.io.BufferedWriter;
    import java.io.PrintWriter;
    
    /**
    * csvファイルを読み込む練習クラス
    * @author beginnerOfLife
    *
    */
    public class CsvSampleMain {
        private static final String FILENAME = "test.csv";
        private static final String OUTPUTNAME = "result.csv";
    
        public static void main(String[] args) {
            //　読み込んだ内容を格納するためのリスト
            List<List<String>> ret = new ArrayList<List<String>>();
            try {
                File f = new File(FILENAME);
                BufferedReader br = new BufferedReader(new FileReader(f));
    
                //csvファイルから読みこんだデータを格納するString
                String line = "";
    
                while((line = br.readLine()) != null) {
                    //csvの一行を格納するリスト
                    List<String> tmpList = new ArrayList<String>();
                    String array[] = line.split(",");
    
                    //  c列がmの行だけを抽出(それ以外はスキップ)
                    if(!array[2].equalsIgnoreCase("m")) {
                        continue;
                    }
                    //　配列から可変長リストに変換
                    tmpList = new ArrayList<String>(Arrays.asList(array));
                    // D列を削除
                    tmpList.remove(3);
                    //　確認のためリストの内容を出力
                    System.out.println(tmpList);
                    //　リストに1行データを格納
                    ret.add(tmpList);
                }
                br.close();
                //  e列の自然順序付けで行を並び替える
                ret.sort((x, y) -> Integer.parseInt(x.get(3)) - Integer.parseInt(y.get(3)));
                //  ファイル出力
                PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(OUTPUTNAME)));
                for(List<String> l: ret) {
                    pw.println(String.join(",", l));
                }
                pw.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2018-12-17T02:40:25.460
51279
2018-12-17T02:40:25.460
9820
51267
answer