作りたいもの
特定のフォルダ(現在エディターの引数に設定済み)内のファイルの中からHTMLファイルのみを取得、
そのHTMLファイル名とファイル内の<title></title>の間にある要素を取得、
取得したファイル名、要素をプログラム実行の日時がわかるようなcsvファイルに記述する。
と言ったものを作りたいと思っております。!
基礎を固める段階にいると考えているのでライブラリの使用などは考えていません。
課題になっているもの
同じような質問を1度しているJava初学者です。
前回いただいたアドバイス大変勉強になりました。
その後、自分自身でコードを書き足していたのですが、
・前回まで出来ていたフォルダの中のHTMLファイルのみを読み込む。 が出来なくなってしまいました。
また前回に引き続きなのですが、
・HTMLファイル内のタイトルの取得が出来ず<title></title>があるファイルもタイトル無しと表記されてしまう。
という2つが問題になっています。
titleが取得できない原因は正規表現にあると思っています。前回ご回答いただいた方々のものも試してみたのですが上手くいきませんでした。
現状こうなってしまっており、
最終的には
ファイル名 スペース タイトル 改行
ファイル名 スペース タイトル 改行
という形にしてみたいのですが、今はタイトルの取得のみを考えております。
該当のソースコード
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.regex.Pattern; import java.util.regex.Matcher; public class App { public static void main(String[] args) throws Exception { //カレンダークラスにより現在日時を取得 Calendar c = Calendar.getInstance(); // 日時のフォーマットを設定 DateFormat myFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); // ファイル名を定義 String FileName = "index" + myFormat.format(c.getTime()); // 場所を定義し、csvに拡張子を変更 File newFile = new File("/Users/mono/tmp/" + FileName + ".csv"); try{ if(newFile.createNewFile()){ System.out.println(FileName + "のファイルの作成に成功"); }else{ System.out.println("ファイルの作成に失敗"); } }catch(IOException e){ System.out.println(e); } // フォルダを指定 if (args.length != 0){ //引数必ず1つであること File dir = new File(args[0]); //設定からフォルダを引数として受け取る File[] fileList = dir.listFiles(); //フォルダの中身を配列として格納 if(fileList != null){ //もしフォルダの中身が終わってないなら for(int i = 0; i < fileList.length; i++){ //繰り返し処理をします try{ if (fileList[i].getName().contains(".html")){//もし html を含むファイル名があるならば if (checkBeforewritefile(newFile)){ // もしcsvファイルに書き込みをするならば BufferedWriter bw = new BufferedWriter(new FileWriter(newFile)); // csvファイルにファイル書き込みをする宣言 BufferedReader br = new BufferedReader(new FileReader(fileList[i])); // ファイルを読み込む準備 String line; // String型を定義 String regex = "<(title|title)>.*?</>"; // これを取得したいと定義 Pattern p = Pattern.compile(regex); // 定義した物をパターンと定義 while((line = br.readLine()) != null){ // 行がなくなるまで1行ずつ処理していく if (check(p,line)){ bw.write(line); }else{ bw.write("タイトル無し"); } } bw.write(fileList[i].getName()); //フォルダから取得したhtmlを含むファイル名をcsvファイルに書き込み System.out.println(fileList[i].getName() + "のファイル名を書き込みました"); bw.close(); } }else{ System.out.println("書き込めませんでした"); } }catch(IOException e){ System.out.println(e); }finally{ } } } } } private static boolean checkBeforewritefile(File newFile) { if(newFile.exists()){ if(newFile.isFile() && newFile.canWrite()){ return true; } } return false; } private static boolean check(Pattern p, String line) { Matcher m = p.matcher(line); if (m.find()){ return true; }else{ return false; } } }
試したこと
前回ご回答いただいた方々のコードやお言葉を参考にし、現在も模索中でございます。
HTMLファイルのみの取得に関しては繰り返しの処理に問題があると考え、順番を入れ替えるなどをしてみました。
回答1件
あなたの回答
tips
プレビュー