0

我正在使用 JAVA 开发 Android 应用程序。

我有一个这样的文本文件,它在互联网上

http://www2.compute.com.tw/~yflin/music.txt

它显示如下

Name="testMusic1" Uri="http://www2.compute.com.tw/test1.mp3" Author="chali" Length=125 Icon="xxx" Lang="台语"
Name="testMusic2" Uri="http://www2.compute.com.tw/test2.mp3" Author="yflin" Length=123 Icon="xxx" Lang="国语"
Name="testMusic3" Uri="http://www2.compute.com.tw/test3.mp3" Author="kkj" Length=132 Icon="xxx" Lang="英文"

但据我所知,我知道如何解析 .csv 文件,我也知道如何解析 xml 文件,使用 XPath 表示,

但!有没有更简单的方法来解析这样的文本文件/?? 有什么好的API可以用来解析这样的文本文件???或使用 JAVA 扫描仪和 useDelimiter ???

有没有用JAVA写的例子??因为我真的无法再查找了......已经搜索/调查了很长时间。有人能帮我吗??

4

3 回答 3

2

这是一个完整的测试工作程序。只需将此文件放在你的 music.txt 所在的位置并运行它。它也使用Scanner类。

import java.io.*;
import java.util.*;

public class Program {

    public static void main(String[] args) throws Exception{
        FileReader file = new FileReader("music.txt");
        Scanner scanner = new Scanner(file);
        while(scanner.hasNextLine()){
            String line = scanner.nextLine().trim();
            String[] tokens = line.split("\\s+");
            for(int i = 0; i < tokens.length; i++){
                String[] elements = tokens[i].split("=");
                System.out.println(elements[0] + ": " + elements[1]);
            }
            System.out.println();
        }
        scanner.close();
    }
}

样本输出

Name: "testMusic1"
Uri: "http://www2.compute.com.tw/test1.mp3"
Author: "chali"
Length: 125
Icon: "xxx"
Lang: "test1"

Name: "testMusic2"
Uri: "http://www2.compute.com.tw/test2.mp3"
Author: "yflin"
Length: 123
Icon: "xxx"
Lang: "test2"

Name: "testMusic3"
Uri: "http://www2.compute.com.tw/test3.mp3"
Author: "kkj"
Length: 132
Icon: "xxx"
Lang: "test3"

VVV

于 2013-09-17T03:24:42.427 回答
1

一种可能性是 String.split()。

例子:

public class Split {

  static final String s = 
    "Name=\"testMusic1\"   Uri=\"http://www2.compute.com.tw/test1.mp3\"   Author=\"chali\"";

  public static void main (String[] args) {
    String[] nameValuePairs = s.split("\\s+"); // Split each item in string on whitespace (\s+)
    for (int i=0; i < nameValuePairs.length; i++) {
      String[] nv = nameValuePairs[i].split("=");  // Split the resulting name/value pair on "="
      System.out.println ("pair[" + i + "]: (" + nameValuePairs[i] + "), name=" + nv[0] + ", value=" + nv[1] + ".");
    }
  }

}

样品输出:

pair[0]: (Name="testMusic1"), name="Name, value="testMusic1".
pair[1]: (Uri="http://www2.compute.com.tw/test1.mp3"), name=Uri, value="http://www2.compute.com.tw/test1.mp3".
pair[2]: (Author="chali"), name=Author, value="chali".
于 2013-09-17T03:10:11.007 回答
0

这里的问题是您没有为输入提供正确的语法,并且设计基于解析器的示例是......狡猾的。

例如,如果我们假设所有示例都将看起来像这样,那么String.split("\\s+")接下来String.split("=")将完成这项工作。或者您可以使用Scanner.

但是,如果其他示例(您还没有看到)有点不同,这可能行不通。例如:

  • 键/值对的顺序可能不同,
  • 键名可能有不同的大小写,
  • 键名可能包含空格,
  • 这些值可能包含空格,
  • 引用的字符串中可能有一些转义约定来处理嵌入的引号字符等,
  • 值的结束引号和下一个键名之间可能没有空格,

简而言之,这些示例中是否有足够的信息供您(或任何人)实现适用于所有输入的解析器是值得怀疑的。

于 2013-09-17T04:12:08.330 回答