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

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

ただいまの
回答率

88.91%

textファイルを順番に読み込むことができず、text内の値を更新することができない。

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 302

ibuki_ayah

score 2

> プログラムで実現したいこと
サーバー9台分(本物ではない)にリリースするためのtxtファイル9個分の日付情報を自動更新するプログラムを
作っています。csvに手入力メモした「新fm・新to」の日付を抽出して、txtファイルにある「旧fm・旧to」に上書きしたいです。

> 解決したいこと①
一行ずつ読み込む際、nullの行まで到達していないから無限ループになってしまう。
次の行に進むためのソースが必要なのは分かるが、その方法が調べてもわからない。
next.lineを使ったが次の行に進めなかった。

> 新しい日付

dc.misyori_kensu_B_fm=0528
dc.misyori_kensu_B_to=0628


> 古い日付

dc.misyori_kensu_A_to=1128
dc.misyori_kensu_B_to=1228

> 解決したいこと⓶
csvDateメソッド内の「dc.misyori_kensu_B_fm=.*」の正規表現「.*」を「0528」として抽出したかったが、できない。考えられる原因として、一行目の行で永遠に停滞しているから、お目当ての行まで行きついていない、

> コンソール結果

> 抽出した文字はjava.util.regex.Matcher[pattern=dc.misyori_kensu_B_fm=.* region=0,24 lastmatch=]です
B期間のFromの日付を見つけました
抽出した文字はjava.util.regex.Matcher[pattern=dc.misyori_kensu_B_fm=.* region=0,24 lastmatch=]です
B期間のFromの日付を見つけました
抽出した文字はjava.util.regex.Matcher[pattern=dc.misyori_kensu_B_fm=.* region=0,24 lastmatch=]です
B期間のFromの日付を見つけました
抽出した文字はjava.util.regex.Matcher[pattern=dc.misyori_kensu_B_fm=.* region=0,24 lastmatch=]です
B期間のFromの日付を見つけました

package Main;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class properties {

    //pathを定義 (グローバル変数)
    public static String[] path = new String[9];

    public static void main(String[] args){

        //9個分のファイルの格納場所を定義
        path[0] ="C:\\Users\\Desktop\\SD\\ZSVF01P\\FD\\dc\\classes\\properties.txt";    //ZSVF01P
        path[1] ="C:\\Users\\Desktop\\SD\\ZSVF02P\\FD\\dc\\classes\\properties.txt";    //ZSVF02P
        path[2] ="C:\\Users\\Desktop\\SD\\ZSVF03P\\FD\\dc\\classes\\properties.txt";    //ZSVF03P
        path[3] ="C:\\Users\\Desktop\\SD\\ZSVF04P\\FD\\dc\\classes\\properties.txt";    //ZSVF04P
        path[4] ="C:\\Users\\Desktop\\SD\\ZSVF05P\\FD\\dc\\classes\\properties.txt";    //ZSVF05P
        path[5] ="C:\\Users\\Desktop\\SD\\ZSVF06P\\FD\\dc\\classes\\properties.txt";    //ZSVF06P
        path[6] ="C:\\Users\\Desktop\\SD\\ZSVF07P\\FD\\dc\\classes\\properties.txt";    //ZSVF07P
        path[7] ="C:\\Users\\Desktop\\SD\\ZSVF08P\\FD\\dc\\classes\\properties.txt";    //ZSVF08P
        path[8] ="C:\\Users\\Desktop\\SD\\ZSVF09P\\FD\\dc\\classes\\properties.txt";    //ZSVF09P

        //ファイルのテキストデータ編集メソッド(引数)
        csvDate();
        dcConversion(path);
    }
    public static void csvDate(String[] args) {
        try{
                //更新日を指定したcsvを読み込む宣言
                File csv = new File("C:\\Users\\Desktop\\表示期間.csv");

                //csvを読み込む
                FileReader fr1 = new FileReader(csv);
                //効率的な読み込み
                BufferedReader br1 = new BufferedReader(fr1);

                System.out.println("csvファイルを読み込みました。");

                // 読み込んだ1行の文字列を格納するための変数
                String line;
                // 1行目を読んでみる。もし空のファイルなら、line には null がセットされる。
                line = br1.readLine();

                while(line!= null) {

                    //判定する行
                    line = "dc.misyori_kensu_B_fm=.*";

                    //kensu_B_fm=0528 の「0528」を抽出したい
                    Pattern p = Pattern.compile("dc.misyori_kensu_B_fm=.*");
                    Matcher m = p.matcher(line);

                    System.out.println("抽出した文字は"+m+"です");

                    if (m.find()){
                          System.out.println("B期間のFromの日付を見つけました");
                    }

                    //判定する行
                    line = "dc.misyori_kensu_B_to=.*";

                    //kensu_B_toの行にある日付部分のみ抽出したい
                    Pattern p2 = Pattern.compile("kensu_B_to=.*");
                    Matcher m2 = p.matcher(line);

                    if (m2.find()){
                          System.out.println("B期間のToの日付を見つけました");
                    }
                }
                    br1.close();
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public static void dcConversion(String[] path) {
        for(int i=0; i<path.length; i++){
            try{
                //txtファイルを読み込む宣言
                File file = new File(path[8]);

                //txtファイルを読み込む
                FileReader fr1 = new FileReader(file);
                //効率的に読み込みできるメソッド
                BufferedReader br1 = new BufferedReader(fr1);

                // 読み込んだ1行の文字列を格納するための変数
                String line2;
                // 1行目を読んでみる。もし、空のファイルなら、line には null がセットされる。
                line2 = br1.readLine();

                System.out.println("txtファイルを読み込みました。");

                //文字列がない行まで一行ずつ読み込む。行を全て読み込んだらnullを返す。
                while(line2!= null) {

                    System.out.println(line2);

                    //抽出したcsvの一行にある日付(0528)をtxtの該当行に書き込みする。
                    line2 = line2.replace("dc.misyori_kensu_B_fm=.*", "dc.misyori_kensu_B_fm,m1");    
                    line2 = line2.replace("dc.misyori_kensu_B_to=.*", "dc.misyori_kensu_B_to,m2");    

                    System.out.println(line2+"に更新しました。");
                    System.out.println(line2+"に更新しました。");
                }

                br1.close();
            }
            catch (IOException ex) {
                ex.printStackTrace();
            }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2020/07/11 17:28

    そもそも、固定で読み込んでいるようだが 他8個を渡している理由は?
    File file = new File(path[8]);

    キャンセル

  • ibuki_ayah

    2020/07/11 17:41

    サーバー9台分(本物ではない)にリリースするための元となるtxtファイルの情報を自動編集するためです。
    9種類のフォルダの階層が各々深く、手で編集するのも面倒なため、プログラムを組もうとしています。

    キャンセル

  • dodox86

    2020/07/14 08:39 編集

    今、質問文中に上がっているJavaソースコードはコンパイルが通りません。(OpenJDK 1.8.0_252)
    ですので、試させていただくのを断念しました。

    $ javac properties.java
    properties.java:29: error: method csvDate in class properties cannot be applied to given types;
    csvDate();
    ^
    required: String[]
    found: no arguments
    reason: actual and formal argument lists differ in length
    1 error

    キャンセル

回答 2

0

  public static void DraftConversion(String[] path) {

この引数のpathはどこにも使われていません。
そこらへんみなおしましょう

んでもひとつ

path[0] ="\\DS\\ZS01P\\D$\\Draft\\class\\Draft.txt";    //ZS01P

おそらくWindowsでしょうけど、フルパスの記述としては不完全です

解決したいこと② 

あなたはこの記述のどこに問題がある(ありそう)だと思ってるんでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/11 16:25

    ありがとうございました。無事ファイルの読み込み自体はできました。が一行ずる読み込み、日付を更新する処理までたどりつかないです。汗

    キャンセル

  • 2020/07/11 17:32

    ドライブを省略した場合、カレントドライブ以下のファイルパスとして認識するから不完全ではないとおもうぞ(windows の仕様)

    FILE://C:/DS/ZS01P/D$/Draft/class/Draft.txt

    キャンセル

  • 2020/07/11 19:18 編集

    // 読み込んだ1行の文字列を格納するための変数
    > String line = br1.readLine();
    > line = br1.readLine();

    となってますが、lineが上書きされて最初のreadLine()の結果が捨てられてしまってますが、これは意図してることでしょうか

    キャンセル

  • 2020/07/11 19:35

    ミスでした、上書きは意図していないです。 ソースを修正しました。

    キャンセル

0

苦戦されているようなので、それなりに難しいストリームや正規表現を使わない、別のアプローチを考えてみました。
もし↓の前提が当てはまらない場合は使えません^^;

表示期間.csvとproperties.txtのフォーマットは、

  • ほげほげ=ふがふが(以降ほげほげをキーと呼び、ふがふがを値と呼びます)で構成され、それ以外の行がない(=を必ず含む 空行もダメ)
  • キーは空にならない(=が行頭に来ない)
  • 値は空にならない(=が行末に来ない)
  • キーと値は=を含まない(=が複数あった場合2個目の=以降は無視される)
  • 同じキーがないか、あっても後にあったキーを優先でよい。

であるならMap(辞書や連想配列とも呼ばれます)と非常に相性がいいです。
Map (Java Platform SE 8 )

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;


public class Properties {
    public static void main(String[] args) throws IOException {
        dummy(); // 検証用ダミーデータを作成

//        Map<String, String> newDates = getNewDates("C:\\Users\\Desktop\\表示期間.csv");
        Map<String, String> newDates = getNewDates("表示期間.csv"); // 更新用データの読み込み

//        List<String> paths = Arrays.asList(
//                "C:\\Users\\Desktop\\SD\\ZSVF01P\\FD\\dc\\classes\\properties.txt",    //ZSVF01P
//                "C:\\Users\\Desktop\\SD\\ZSVF02P\\FD\\dc\\classes\\properties.txt",    //ZSVF02P
//                "C:\\Users\\Desktop\\SD\\ZSVF03P\\FD\\dc\\classes\\properties.txt",    //ZSVF03P
//                "C:\\Users\\Desktop\\SD\\ZSVF04P\\FD\\dc\\classes\\properties.txt",    //ZSVF04P
//                "C:\\Users\\Desktop\\SD\\ZSVF05P\\FD\\dc\\classes\\properties.txt",    //ZSVF05P
//                "C:\\Users\\Desktop\\SD\\ZSVF06P\\FD\\dc\\classes\\properties.txt",    //ZSVF06P
//                "C:\\Users\\Desktop\\SD\\ZSVF07P\\FD\\dc\\classes\\properties.txt",    //ZSVF07P
//                "C:\\Users\\Desktop\\SD\\ZSVF08P\\FD\\dc\\classes\\properties.txt",    //ZSVF08P
//                "C:\\Users\\Desktop\\SD\\ZSVF09P\\FD\\dc\\classes\\properties.txt");   //ZSVF09P
        List<String> paths = Arrays.asList("properties.txt");

        for (String path : paths) {
            dcConversion(path, newDates); // データの更新
        }
    }

    // 表示期間.csvをキー(dc.misyori_kensu_B_fm等)と値(0528等)の組にして返す
    static Map<String, String> getNewDates(String path) throws IOException {
        Map<String, String> map = new HashMap<String, String>(); // 順番を気にしないMap
        Path file = Paths.get(path);
        List<String> lines = Files.readAllLines(file); // 1行ごとに分割して一気に読み込む

        for (String line : lines) {
            String[] split = line.split("="); // 1行を=の左右に分ける
            map.put(split[0], split[1]); // 左をキー 右を値に
        }

        return map;
    }

    // 指定ファイルの値の更新
    static void dcConversion(String path, Map<String, String> newDates) throws IOException {
        System.out.println(path + " の更新を開始します");

        Map<String, String> map = new LinkedHashMap<String, String>(); // 順番を気にするMap
        Path file = Paths.get(path);
        List<String> lines = Files.readAllLines(file);

        for (String line : lines) {
            String[] split = line.split("=");
            String key = split[0];
            String value = split[1];
            if (newDates.containsKey(key)) { // もしnewDatesにあるキーだったら
                map.put(key, newDates.get(key)); // そっちの値を使う(更新)
                System.out.println(key + " を " + value + " から " + newDates.get(key) + " に更新しました");
            } else {
                map.put(key, value); // なければそのまま
            }
        }

        List<String> newLines = new ArrayList<>();
        for (Map.Entry<String, String> entry : map.entrySet()) { // キーと値をまとめてループ
            newLines.add(entry.getKey() + "=" + entry.getValue()); // キーと値を=でつなげて元に戻す
        }

        Files.write(Paths.get(path), newLines); // 丸ごと上書き
    }

    // 検証用にカレントフォルダにダミーデータを作成
    static void dummy() throws IOException {
        List<String> list = Arrays.asList(
                "hogehoge=piyopiyo",
                "dc.misyori_kensu_B_fm=0528",
                "dc.misyori_kensu_B_to=0628");
        Files.write(Paths.get("表示期間.csv"), list); // 普通これをCSV(comma-separated values)ファイルとは言わない

        list = Arrays.asList(
                "hogehoge=fugafuga",
                "dc.misyori_kensu_A_fm=1128",
                "dc.misyori_kensu_A_to=1228",
                "dc.misyori_kensu_B_fm=1128",
                "dc.misyori_kensu_B_to=1228",
                "dc.misyori_kensu_C_fm=1128",
                "dc.misyori_kensu_C_to=1228");
        Files.write(Paths.get("properties.txt"), list);
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る