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

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

新規登録して質問してみよう
ただいま回答率
85.48%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

Q&A

2回答

1213閲覧

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

ibuki_ayah

総合スコア2

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

0グッド

0クリップ

投稿2020/07/06 22:19

編集2020/07/13 22:14

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

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

> 新しい日付

csv

1dc.misyori_kensu_B_fm=0528 2dc.misyori_kensu_B_to=0628

> 古い日付

txt

1dc.misyori_kensu_A_to=1128 2dc.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の日付を見つけました

java

1package Main; 2 3import java.io.BufferedReader; 4import java.io.File; 5import java.io.FileReader; 6import java.io.IOException; 7import java.util.regex.Matcher; 8import java.util.regex.Pattern; 9 10public class properties { 11 12 //pathを定義 (グローバル変数) 13 public static String[] path = new String[9]; 14 15 public static void main(String[] args){ 16 17 //9個分のファイルの格納場所を定義 18 path[0] ="C:\Users\Desktop\SD\ZSVF01P\FD\dc\classes\properties.txt"; //ZSVF01P 19 path[1] ="C:\Users\Desktop\SD\ZSVF02P\FD\dc\classes\properties.txt"; //ZSVF02P 20 path[2] ="C:\Users\Desktop\SD\ZSVF03P\FD\dc\classes\properties.txt"; //ZSVF03P 21 path[3] ="C:\Users\Desktop\SD\ZSVF04P\FD\dc\classes\properties.txt"; //ZSVF04P 22 path[4] ="C:\Users\Desktop\SD\ZSVF05P\FD\dc\classes\properties.txt"; //ZSVF05P 23 path[5] ="C:\Users\Desktop\SD\ZSVF06P\FD\dc\classes\properties.txt"; //ZSVF06P 24 path[6] ="C:\Users\Desktop\SD\ZSVF07P\FD\dc\classes\properties.txt"; //ZSVF07P 25 path[7] ="C:\Users\Desktop\SD\ZSVF08P\FD\dc\classes\properties.txt"; //ZSVF08P 26 path[8] ="C:\Users\Desktop\SD\ZSVF09P\FD\dc\classes\properties.txt"; //ZSVF09P 27 28 //ファイルのテキストデータ編集メソッド(引数) 29 csvDate(); 30 dcConversion(path); 31 } 32 public static void csvDate(String[] args) { 33 try{ 34 //更新日を指定したcsvを読み込む宣言 35 File csv = new File("C:\Users\Desktop\表示期間.csv"); 36 37 //csvを読み込む 38 FileReader fr1 = new FileReader(csv); 39 //効率的な読み込み 40 BufferedReader br1 = new BufferedReader(fr1); 41 42 System.out.println("csvファイルを読み込みました。"); 43 44 // 読み込んだ1行の文字列を格納するための変数 45 String line; 46 // 1行目を読んでみる。もし空のファイルなら、line には null がセットされる。 47 line = br1.readLine(); 48 49 while(line!= null) { 50 51 //判定する行 52 line = "dc.misyori_kensu_B_fm=.*"; 53 54 //kensu_B_fm=0528 の「0528」を抽出したい 55 Pattern p = Pattern.compile("dc.misyori_kensu_B_fm=.*"); 56 Matcher m = p.matcher(line); 57 58 System.out.println("抽出した文字は"+m+"です"); 59 60 if (m.find()){ 61 System.out.println("B期間のFromの日付を見つけました"); 62 } 63 64 //判定する行 65 line = "dc.misyori_kensu_B_to=.*"; 66 67 //kensu_B_toの行にある日付部分のみ抽出したい 68 Pattern p2 = Pattern.compile("kensu_B_to=.*"); 69 Matcher m2 = p.matcher(line); 70 71 if (m2.find()){ 72 System.out.println("B期間のToの日付を見つけました"); 73 } 74 } 75 br1.close(); 76 } 77 catch (IOException ex) { 78 ex.printStackTrace(); 79 } 80 } 81 82 public static void dcConversion(String[] path) { 83 for(int i=0; i<path.length; i++){ 84 try{ 85 //txtファイルを読み込む宣言 86 File file = new File(path[8]); 87 88 //txtファイルを読み込む 89 FileReader fr1 = new FileReader(file); 90 //効率的に読み込みできるメソッド 91 BufferedReader br1 = new BufferedReader(fr1); 92 93 // 読み込んだ1行の文字列を格納するための変数 94 String line2; 95 // 1行目を読んでみる。もし、空のファイルなら、line には null がセットされる。 96 line2 = br1.readLine(); 97 98 System.out.println("txtファイルを読み込みました。"); 99 100 //文字列がない行まで一行ずつ読み込む。行を全て読み込んだらnullを返す。 101 while(line2!= null) { 102 103 System.out.println(line2); 104 105 //抽出したcsvの一行にある日付(0528)をtxtの該当行に書き込みする。 106 line2 = line2.replace("dc.misyori_kensu_B_fm=.*", "dc.misyori_kensu_B_fm,m1"); 107 line2 = line2.replace("dc.misyori_kensu_B_to=.*", "dc.misyori_kensu_B_to,m2"); 108 109 System.out.println(line2+"に更新しました。"); 110 System.out.println(line2+"に更新しました。"); 111 } 112 113 br1.close(); 114 } 115 catch (IOException ex) { 116 ex.printStackTrace(); 117 } 118 119 } 120 } 121} 122 123

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

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

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

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

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

m.ts10806

2020/07/06 22:45

フォルダパスはエクスプローラそのまま貼り付けては。
ibuki_ayah

2020/07/11 07:26

ありがとうございました。ファイルの読み込みじたいはできました。
dodox86

2020/07/11 08:06

> デバッグ時に、csvDateメソッドのコンソール出力がスキップされて、dcConversionメソッドのコンソール出力が先にされてしまう。 スキップも何も、そもそもcsvDateメソッドが呼ばれていませんが。
退会済みユーザー

退会済みユーザー

2020/07/11 08:28

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

2020/07/11 08:41

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

2020/07/13 23:44 編集

今、質問文中に上がっている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
guest

回答2

0

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

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

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

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

Java

1import java.io.IOException; 2import java.nio.file.Files; 3import java.nio.file.Path; 4import java.nio.file.Paths; 5import java.util.ArrayList; 6import java.util.Arrays; 7import java.util.HashMap; 8import java.util.LinkedHashMap; 9import java.util.List; 10import java.util.Map; 11 12 13public class Properties { 14 public static void main(String[] args) throws IOException { 15 dummy(); // 検証用ダミーデータを作成 16 17// Map<String, String> newDates = getNewDates("C:\Users\Desktop\表示期間.csv"); 18 Map<String, String> newDates = getNewDates("表示期間.csv"); // 更新用データの読み込み 19 20// List<String> paths = Arrays.asList( 21// "C:\Users\Desktop\SD\ZSVF01P\FD\dc\classes\properties.txt", //ZSVF01P 22// "C:\Users\Desktop\SD\ZSVF02P\FD\dc\classes\properties.txt", //ZSVF02P 23// "C:\Users\Desktop\SD\ZSVF03P\FD\dc\classes\properties.txt", //ZSVF03P 24// "C:\Users\Desktop\SD\ZSVF04P\FD\dc\classes\properties.txt", //ZSVF04P 25// "C:\Users\Desktop\SD\ZSVF05P\FD\dc\classes\properties.txt", //ZSVF05P 26// "C:\Users\Desktop\SD\ZSVF06P\FD\dc\classes\properties.txt", //ZSVF06P 27// "C:\Users\Desktop\SD\ZSVF07P\FD\dc\classes\properties.txt", //ZSVF07P 28// "C:\Users\Desktop\SD\ZSVF08P\FD\dc\classes\properties.txt", //ZSVF08P 29// "C:\Users\Desktop\SD\ZSVF09P\FD\dc\classes\properties.txt"); //ZSVF09P 30 List<String> paths = Arrays.asList("properties.txt"); 31 32 for (String path : paths) { 33 dcConversion(path, newDates); // データの更新 34 } 35 } 36 37 // 表示期間.csvをキー(dc.misyori_kensu_B_fm等)と値(0528等)の組にして返す 38 static Map<String, String> getNewDates(String path) throws IOException { 39 Map<String, String> map = new HashMap<String, String>(); // 順番を気にしないMap 40 Path file = Paths.get(path); 41 List<String> lines = Files.readAllLines(file); // 1行ごとに分割して一気に読み込む 42 43 for (String line : lines) { 44 String[] split = line.split("="); // 1行を=の左右に分ける 45 map.put(split[0], split[1]); // 左をキー 右を値に 46 } 47 48 return map; 49 } 50 51 // 指定ファイルの値の更新 52 static void dcConversion(String path, Map<String, String> newDates) throws IOException { 53 System.out.println(path + " の更新を開始します"); 54 55 Map<String, String> map = new LinkedHashMap<String, String>(); // 順番を気にするMap 56 Path file = Paths.get(path); 57 List<String> lines = Files.readAllLines(file); 58 59 for (String line : lines) { 60 String[] split = line.split("="); 61 String key = split[0]; 62 String value = split[1]; 63 if (newDates.containsKey(key)) { // もしnewDatesにあるキーだったら 64 map.put(key, newDates.get(key)); // そっちの値を使う(更新) 65 System.out.println(key + " を " + value + " から " + newDates.get(key) + " に更新しました"); 66 } else { 67 map.put(key, value); // なければそのまま 68 } 69 } 70 71 List<String> newLines = new ArrayList<>(); 72 for (Map.Entry<String, String> entry : map.entrySet()) { // キーと値をまとめてループ 73 newLines.add(entry.getKey() + "=" + entry.getValue()); // キーと値を=でつなげて元に戻す 74 } 75 76 Files.write(Paths.get(path), newLines); // 丸ごと上書き 77 } 78 79 // 検証用にカレントフォルダにダミーデータを作成 80 static void dummy() throws IOException { 81 List<String> list = Arrays.asList( 82 "hogehoge=piyopiyo", 83 "dc.misyori_kensu_B_fm=0528", 84 "dc.misyori_kensu_B_to=0628"); 85 Files.write(Paths.get("表示期間.csv"), list); // 普通これをCSV(comma-separated values)ファイルとは言わない 86 87 list = Arrays.asList( 88 "hogehoge=fugafuga", 89 "dc.misyori_kensu_A_fm=1128", 90 "dc.misyori_kensu_A_to=1228", 91 "dc.misyori_kensu_B_fm=1128", 92 "dc.misyori_kensu_B_to=1228", 93 "dc.misyori_kensu_C_fm=1128", 94 "dc.misyori_kensu_C_to=1228"); 95 Files.write(Paths.get("properties.txt"), list); 96 } 97}

投稿2020/07/14 09:51

編集2020/07/14 14:32
TN8001

総合スコア9321

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

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

0

public static void DraftConversion(String[] path) {

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

んでもひとつ

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

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

解決したいこと②

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

投稿2020/07/06 22:25

編集2020/07/07 01:33
y_waiwai

総合スコア87774

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

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

ibuki_ayah

2020/07/11 07:25

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

退会済みユーザー

2020/07/11 08:32

ドライブを省略した場合、カレントドライブ以下のファイルパスとして認識するから不完全ではないとおもうぞ(windows の仕様) FILE://C:/DS/ZS01P/D$/Draft/class/Draft.txt
y_waiwai

2020/07/11 10:18 編集

// 読み込んだ1行の文字列を格納するための変数 > String line = br1.readLine(); > line = br1.readLine(); となってますが、lineが上書きされて最初のreadLine()の結果が捨てられてしまってますが、これは意図してることでしょうか
ibuki_ayah

2020/07/11 10:35

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問