2016-12-28 136 views
2

我有幾個問題。我試圖將我的文本格式化爲一種簡單的格式來讀取。我目前有:格式化文本

MAC11053hrsECO20133hrsECO20233hrsANT20003hrsPSY20123hrsSYG20003hrsACG20213hrsACG20713hrsCGS21003hrsECO20133hrsECO20233hrsECO34013hrsMAC22333hrsSTA20233hrsACG31313hrsECO34113hrsFIN34033hrsMAN30253hrsMAR30233hrsBUL31303hrsGEB33753hrsMAR32033hrsACG31413hrsACG33613hrsACG44013hrsACG46513hrsACG48033hrsMAN47203hrsACG49033hrsACG49043hrsACG49703hrsENC11013hrsMAC11053hrsECO20133hrsENC11023hrsECO20233hrsACG20213hrsSPC16083hrsACG20713hrsECO34013hrsCGS21003hrsACG31313hrsFIN34033hrsMAR30233hrsECO34113hrsMAN30253hrsACG31413hrsACG33613hrsBUL31303hrsACG44013hrsGEB33753hrsMAR32033hrsACG46513hrsACG48033hrsMAN47203hrs 

我想:

MAC1105 3hrs 
ECO2013 3hrs 
ect. 

到目前爲止我的代碼吸!我一直在試圖弄清楚這一點,但我似乎無法使用任何其他帖子來解決似乎是一個相當簡單的問題。我基本上正在閱讀每一行,然後嘗試插入" ""\n"以格式化輸出。我想使用for循環int d < line.length();,但似乎我的理解完全錯誤。在我的文本文檔中,它顯示了大約8行所有這些課程代碼,但它似乎都在同一行(我認爲)。我如何設置?

import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.Scanner; 

public class Indentation { 

    public static void main(String[] args) throws IOException { 
     File inFile = new File("/Users/Richard/Desktop/resources/Out.txt"); 

     File outFile = new File("/Users/Richard/Desktop/resources/finally.txt"); 

     FileWriter fWriter = new FileWriter(outFile); 
     PrintWriter pWriter = new PrintWriter(fWriter); 

     Scanner sc = new Scanner(inFile); 
     while (sc.hasNextLine()) { 
      String line = sc.nextLine(); 
      String s = line; 
      StringBuilder sb = new StringBuilder(s); 

      for (int d = 1; d < 61; d++) { 
       sb.insert(d * 7, " "); 
       sb.insert(d * 12, "\n"); 
      } 

      pWriter.print(sb.toString()); 
      System.out.println(sb.toString()); 
     } 
     sc.close(); 

    } 

} 
+0

考慮MAC11053hrs,MAC始終是3個位數代碼? 11005總是4?時間不超過9? – Thrasher

回答

4

你會發現正則表達式非常有用這裏的概念。從一些很好的教程中獲得更多的信息,如this one by Oracle/Sun

您還需要對輸入做一些假設。例如,課程代碼總是三個「單詞字符」,後跟四個數字。持續時間(hrs)始終是一個或兩位數字,然後字符串「小時」,等等。一旦你有,你可以編寫正則表達式像 我有如下:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class ScanText1 { 

    public static void main(String[] args) { 
     String input = "MAC11053hrsECO20133hrsECO20233hrsANT20003hrsPSY20123hrsSYG20003hrsACG20213hrsACG20713hrsCGS21003hrsECO20133hrsECO20233hrsECO34013hrsMAC22333hrsSTA20233hrsACG31313hrsECO34113hrsFIN34033hrsMAN30253hrsMAR30233hrsBUL31303hrsGEB33753hrsMAR32033hrsACG31413hrsACG33613hrsACG44013hrsACG46513hrsACG48033hrsMAN47203hrsACG49033hrsACG49043hrsACG49703hrsENC11013hrsMAC11053hrsECO20133hrsENC11023hrsECO20233hrsACG20213hrsSPC16083hrsACG20713hrsECO34013hrsCGS21003hrsACG31313hrsFIN34033hrsMAR30233hrsECO34113hrsMAN30253hrsACG31413hrsACG33613hrsBUL31303hrsACG44013hrsGEB33753hrsMAR32033hrsACG46513hrsACG48033hrsMAN47203hrs"; 

     Pattern p 
      = Pattern.compile(
       "(?<courseCode>\\w{3}\\d{4})" /* courseCode: 3 word chars plus 4 digits */ 
       + "(?<hrs>\\d{1,2})hrs"  /* hrs: 1 or 2 digits and then "hrs" */ 
      ); 

     Matcher m = p.matcher(input); 
     while (m.find()) { 
      String courseCode = m.group("courseCode"); 
      int hrs  = Integer.parseInt(m.group("hrs")); 
      System.out.format("%s %dhrs%n", courseCode, hrs); 
     } 
    } 

} 

輸出問題是這樣的:

MAC1105 3hrs 
ECO2013 3hrs 
ECO2023 3hrs 
ANT2000 3hrs 
PSY2012 3hrs 
... 
+0

我該怎麼處理這個錯誤?在索引20附近發生非法重複012,(? \ w {3} \ w {d})(? \ d {1,2})hrs ^ – OneU

+0

對不起,我在原始文章中有一個錯字。只是修復它。這是'p'我在上面更新了我的帖子。 – leeyuiwah

+1

感謝您的幫助!它驚人的有多少種方式來做些事情。我真的一直在嘗試使用各種方法整天,但我無法到達那裏。我很高興你使用了正則表達式! – OneU