我有几个问题。我正在尝试将文本格式化为一种简单的格式来阅读。我目前有:
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 :(得分:4)
您会发现正则表达式的概念在这里非常有用。从一些好的教程中了解更多相关信息,例如this one by Oracle/Sun
此外,您还需要对输入做出一些假设。例如,课程代码总是三个“单词字符”,后跟四个数字。持续时间(hrs
)始终是一个或两个数字后面跟着字符串“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
...