2016-12-28 3 views
2

У меня есть пара вопросов. Я пытаюсь отформатировать текст в простой формат для чтения. Я в настоящее время:Форматирование текста

MAC11053hrsECO20133hrsECO20233hrsANT20003hrsPSY20123hrsSYG20003hrsACG20213hrsACG20713hrsCGS21003hrsECO20133hrsECO20233hrsECO34013hrsMAC22333hrsSTA20233hrsACG31313hrsECO34113hrsFIN34033hrsMAN30253hrsMAR30233hrsBUL31303hrsGEB33753hrsMAR32033hrsACG31413hrsACG33613hrsACG44013hrsACG46513hrsACG48033hrsMAN47203hrsACG49033hrsACG49043hrsACG49703hrsENC11013hrsMAC11053hrsECO20133hrsENC11023hrsECO20233hrsACG20213hrsSPC16083hrsACG20713hrsECO34013hrsCGS21003hrsACG31313hrsFIN34033hrsMAR30233hrsECO34113hrsMAN30253hrsACG31413hrsACG33613hrsBUL31303hrsACG44013hrsGEB33753hrsMAR32033hrsACG46513hrsACG48033hrsMAN47203hrs 

Я хочу:

MAC1105 3hrs 
ECO2013 3hrs 
ect. 

Пока мой код отстой! Я пытался понять это, но я не могу использовать какие-либо другие сообщения для решения того, что кажется довольно простой проблемой. Я, по сути, читаю каждую строку, а затем пытаюсь вставить " " и "\n" для форматирования вывода. Я хотел использовать цикл for int d < line.length();, но кажется, что мое понимание совершенно неверно. В моем тексте doc он показывает все эти коды курса примерно в 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 (? \ w {3} \ w {d}) (? \ d {1,2}) hrs ^ – OneU

+0

Извините, у меня была опечатка в моем оригинальном посте. Просто исправил это. Это было в строке для 'p', я обновил свой пост выше. – leeyuiwah

+1

Спасибо за помощь! Удивительно, как много способов сделать что-то. Я честно пробовал весь день с помощью различных методов, но я просто не мог туда добраться. Я рад, что вы использовали регулярное выражение! – OneU

Смежные вопросы