获取字段的起始位置

时间:2012-05-31 06:55:04

标签: java

嗨大家我正在编写一个以这种格式读取文本文件的代码:

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");
    }
}

3 个答案:

答案 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("|")] = ",";
}