-3

我有这样的文本文件。

12A aa65 3244 5 665 fr 65 3434344344343 888dds 77786334 6h
1114 22 6FF 7 d M6 h o8 665466676 8Pt 543NNv 9

该文件位于不同宽度的列中,例如,第一列是 6 个字符宽,第二列是 5 个字符,第三列是 5 个字符,以此类推。

我想将每一行拆分为列中的值,例如第一行:

12A , aa65 , 3244 , 5 , , 665 , fr , 65 , 3434344344343 , 888dds , 77786334 , 6h
4

5 回答 5

4

更新答案

啊,好吧,你想按列的宽度分割文本。看起来您的列长度是:

6
5
5
6
8
6
4
18
9
(其余的部分)

所以阅读这些行,BufferedReader#readLine然后只使用String#substring它们来获取它们的各个部分,并可能String#trim修剪掉空格:

BufferedReader r = /*...get a BufferedReader for your input...*/;
String line;
String[] parts;
int[] columns = new int[]{ // The starting index of each column
    6,
    5+6,
    5+5+6,
    6+5+5+6,
    8+6+5+5+6,
    6+8+6+5+5+6,
    4+6+8+6+5+5+6,
    18+4+6+8+6+5+5+6,
    9+18+4+6+8+6+5+5+6
};
int i;
int start, end;
int linelen;

// Read each line
while ((line = r.readLine()) != null) {
    // Get its length
    linelen = line.length();

    // Get an array for the result
    parts = new string[columns.length];

    // Loop through our column starting indexes
    for (i = 0; i < columns.length; ++i ) {
        // Get the start and end indexes for this column
        start = columns[i];
        end = i < columns.length - 1 ? columns[i+1] : linelen;

        // Is the string long enough?
        if (linelen < start) {
            // No, use null
            parts[i] = null;
        }
        else {
            // Yes, grab the text
            parts[i] = line.substring(start, end > linelen ? linelen : end);

            // Note - you may want `.trim()` on the end of the above, if you
            // don't want trailing spaces (or leading spaces, but none of your
            // examples has leading spaces).
        }
    }

    // **Use the `parts` of this line.
}

您也可以考虑使用类而不是数组parts,并将其解析逻辑放在类中。


原始答案

听起来您正在寻找BufferedReader#readLineand的组合String#split

BufferedReader r = /*...get a BufferedReader for your input...*/;
String line;
String[] parts;

while ((line = r.readLine()) != null) {
    parts = line.split(" +");
    // Use the `parts` array
}

readLine从输入中读取行。

split使用正则表达式定义的分隔符将字符串拆分为字符串数组。在您的情况下,分隔符看起来只是一个或多个空格。

于 2013-08-11T09:00:54.400 回答
4

使用 Scanner 读取文件并使用 subString(start, end) 方法解析每个字段。

Scanner sc = new Scanner(new File("myFile"));
while (sc.hasNextLine()) {
   String aLine = sc.nextLine();
   String field1 = aLine.subString(0,6);
   String field2 = aLine.subString(6,11);
   ...
}
于 2013-08-11T09:09:21.587 回答
1

您可以使用readline()然后split按空间。

于 2013-08-11T09:00:57.740 回答
1

你想像这里一样进行字符串拆分。

我假设您已经阅读了该文件并且只想拆分它。

用于Str.split("\n")线条和Str.split(" ")空格(如果需要)

于 2013-08-11T09:01:52.317 回答
1

Java 中的几种阅读器形式都有一个 .ReadLine() 方法。这将从源读取输入,直到遇到换行符。

对于文件读取,我通常使用 BufferedReader 作为 FileReader 的包装器,因为这对于批量读取更有效。(每次调用 read 方法时,FileReaders 都会从文件中读取。)

编辑添加:如果您希望对结果进行排序,将数据完全读入内存然后排序会更有效率,因为随机磁盘访问非常慢。

使用自定义比较器将行读入列表或优先级队列将实现您的目标。

于 2013-08-11T09:04:28.920 回答