嗨大家我正在编写一个以这种格式读取文本文件的代码:
City |First Name| Second Name|Last Name|
我目前的输出是:
Column 1 is 17--------City
Column 2 is 10--------First Name
Column 3 is 12--------Second Name
Column 4 is 9---------Last Name
我还需要文本文件中每个字段的起始位置,例如:
Column 1 is 17--------City : Position 1
Column 2 is 10--------First Name: Position 18
Column 3 is 12--------Second Name: Position 31
Column 4 is 9---------Last Name: Position 44
这是我目前的代码。有没有办法实现这个?
package stanley.column.reader;
import java.io.*;
public class StanleyColumnReader {
public static void main(String[] args) throws IOException {
System.out.println("Developed By Stanley Mungai");
File f = new File("C:/File/");
if (!f.exists()) {
f.createNewFile();
} else {
f.delete();
}
String [] files = f.list();
for (int j = 0; j < files.length; j++){
FileInputStream fs = new FileInputStream("C:/File/" + files[j]);
BufferedReader br = new BufferedReader(new InputStreamReader(fs));
String result = "_result";
BufferedWriter is = new BufferedWriter(new FileWriter("C:/File/" + files[j] + result + ".txt"));
for (int i = 0; i < 0; i++) {
br.readLine();
}
String line = br.readLine();
String[] split = line.split("|");
for (int i = 0; i < split.length; i++) {
int k = i + 1;
System.out.println("Calculating the size of field " + k );
is.write("Column " + k + " is " + split[i].length());
is.flush();
is.newLine();
}
}
System.out.println("Success");
System.out.println("Output Saved to C:/File");
}
}
答案 0 :(得分:2)
你可以通过更高级的regexp组匹配来实现,并获得组启动索引。但考虑到这个问题,可能会有点过分和过于先进。
但在你的情况下,一个可能有效的简单方法就是在线上使用indexOf
。
这会改变你的输出包括:
" Position "+(line.indexOf(split[i])+1)
只要姓氏,名字和城市不在同一行重复......
顺便说一下,你几乎不需要在每一行上冲洗,我建议把它移到循环外面。
正则表达式解决方案:
//first declare the pattern once in the class
static final Pattern pattern = Pattern.compile("\\s*(.*?)\\s*\\|");
...
//instead of the split loop:
String line = "City |First Name| Second Name|Last Name| Foo |Bar |"; //br.readLine();
Matcher matcher = pattern.matcher(line);
int column = 1;
while (matcher.find(column == 1 ? 0 : matcher.end())) {
String match = matcher.group(1);
System.out.println("Column " + column + " is " + match.length() + "---" + match + ": Position " + (matcher.start() + 1));
column++;
}
根据您想要的确切位置,您可能希望将(matcher.start()+1)
更改为(matcher.start(1)+1)
答案 1 :(得分:2)
这是assignment
吗?请正确标记。
你还没有说过数据中的分隔符是"|"
还是看到你的代码,我假设它是。
我不明白你提到的第3列的位置是31,第4列是44?第3列应为10 + 17 + 1 = 28,第4列应为10 + 17 + 12 + 1 = 40。如果我弄错了,您也需要发布原始数据。
String[] split = line.split("|");
int pos=1; //initial position
for (int i = 0; i < split.length; i++) {
System.out.println("Calculating the size of field " + (i+1));
is.write("Column " + (i+1) + " is " + pos+" : Position "+pos);
pos=pos+split[i].length+1; //starting position for next column data
is.flush();
is.newLine();
}
或者您可以使用indexOf
方法查找位置:line.indexOf(split[i])+1
答案 2 :(得分:1)
如果我明白你的需要。也许你可以使用indexOf方法。这给你带来了第一个巧合。找到这个后,更改不同的管道并再次调用indexOf管道。
String line = br.readLine();
for (int i = 0; i < split.length; i++) {
System.out.println("Calculating the position " + line.indexOf("|") );
line[line.indexOf("|")] = ",";
}