使用处理分析大型字符串

时间:2015-07-21 02:23:26

标签: java arrays string arraylist

我有一个字符串,我需要拆分并添加到不同的数组。

这是我的字符串

  

{"位置":[{"纬度":" 1.3846519""经度":" 103.763276&# 34;," STARTTIME":" 1422720220292""持续时间":" 0""准确性":&# 34; 50.981998443604"},{"纬度":" 1.3845814""经度":" 103.7634384"&# 34;开始时间":" 1422720520181""持续时间":" 0""准确性":" 55.532001495361&# 34;},{"纬度":" 1.3844195""经度":" 103.763209"" STARTTIME&#34 ;:" 1422720820265""持续时间":" 0""准确性":" 34.5"},{ "纬度":" 1.3844051""经度":" 103.7632272"" STARTTIME":&#34 ; 1422721120466""持续时间":" 0""准确性":" 36"},   ]"成功":1}

我想要的输出在不同的数组中是这样的。

latitudeArray[] = // String array of latitude values
longitudeArray[] = // String array of longitude values
startTimeArray[] = // String array of start time values
durationArray[] = // String array of duration values
accuracyArray[] = // String array of accuracy values

我正在使用处理IDE来分析我的数据,我尝试了matchAll()和split()函数,但无法使其工作。 你能帮助我获得输出吗?感谢。

编辑:我设法提取了一个纬度值,但我的方法似乎非常低效。我怎么能在循环中做到这一点?

    String[] locationData = loadStrings("sample.txt");
    ArrayList<String> latitudeArray = new ArrayList<String>();
    ArrayList<String> longitudeArray = new ArrayList<String>();
    ArrayList<String> startTimeArray = new ArrayList<String>();
    ArrayList<String> durationArray = new ArrayList<String>();
    ArrayList<String> accuracyArray = new ArrayList<String>();
    String temp;
    int index;

    index = locationData[0].indexOf("latitude");
    println(index);
    temp = locationData[0].substring(index+11);
    println(temp);
    index = temp.indexOf(",");
    println(index);
    latitudeArray.add(temp.substring(0,(index-1)));
    println(latitudeArray.get(0));

3 个答案:

答案 0 :(得分:0)

不确定loadStrings()方法返回的格式,所以我只使用了您提供的初始String

您正在使用字符串方法朝正确的方向前进。此代码尝试从单个input字符串中受益。如果你分开&#34;纬度&#34;,那么阵列中的所有元素除了第一个元素之外,都会有我们在开始时感兴趣的数字。例如:split("latitude\":\"")给出了开头的所有纬度:

[0] = {"locations":[{"
[1] = 1.3846519","longitude":"103.763276","startTime":"1422720220292","duration":"0","accuracy":"50.981998443604"},{"
[2] = 1.3845814","longitude":"103.7634384","startTime":"1422720520181","duration":"0","accuracy":"55.532001495361"},{"
[3] = 1.3844195","longitude":"103.763209","startTime":"1422720820265","duration":"0","accuracy":"34.5"},{"
[4] = 1.3844051","longitude":"103.7632272","startTime":"1422721120466","duration":"0","accuracy":"36"}, ],"success":1}

要阅读实际数字,我们只需要阅读下一个引号(")。执行indexOf("\"")将使用我们必须读取的位置来检索该数字。因此,只需在其上执行substring(0,indexOfQuote)即可获得该值。再次重复,但这次分裂经度&#34;得到他们。

完整计划:

public static void main(String[] args) {
    final String INPUT = "{\"locations\":["
            + "{\"latitude\":\"1.3846519\",\"longitude\":\"103.763276\",\"startTime\":\"1422720220292\",\"duration\":\"0\",\"accuracy\":\"50.981998443604\"},"
            + "{\"latitude\":\"1.3845814\",\"longitude\":\"103.7634384\",\"startTime\":\"1422720520181\",\"duration\":\"0\",\"accuracy\":\"55.532001495361\"},"
            + "{\"latitude\":\"1.3844195\",\"longitude\":\"103.763209\",\"startTime\":\"1422720820265\",\"duration\":\"0\",\"accuracy\":\"34.5\"},"
            + "{\"latitude\":\"1.3844051\",\"longitude\":\"103.7632272\",\"startTime\":\"1422721120466\",\"duration\":\"0\",\"accuracy\":\"36\"},"
            + " ],\"success\":1}";
    String latitudeArray[] = splitAndCollect("latitude", INPUT);
    String longitudeArray[] = splitAndCollect("longitude", INPUT);
    String startTimeArray[] = splitAndCollect("startTime", INPUT);
    String durationArray[] = splitAndCollect("duration", INPUT);
    String accuracyArray[] = splitAndCollect("accuracy", INPUT);
    System.out.println("Done");
}

private static String[] splitAndCollect(String string, String input) {
    final String COLON = "\":\"";
    String[] split = input.split(string + COLON);
    String[] output = new String[split.length - 1];
    for (int i = 0; i < output.length; i++)
        // Using [i+1] - since split[0] contains "locations".
        // Subsequent splits will have the numbers needed.
        output[i] = split[i + 1].substring(0, split[i + 1].indexOf("\""));
    System.out.println(string + "\n" + Arrays.toString(output));
    return output;
}

答案 1 :(得分:0)

如果您可以将文件预处理为csv。文件使用简单的shell脚本,然后在java中进行字符串处理,我认为你可以获得更好的性能。对于csv。用Java编写文件,请参考http://www.mkyong.com/java/how-to-read-and-parse-csv-file-in-java/(此博客包含简单示例)。

如果在解析之前执行一些预处理步骤(即使在Java中),您只需使用一个循环就可以获得这些字符串数组的所有值。您可以使用Vineet使用单循环建议的方法。因此,通过预处理步骤,整个循环计数变为2。

谢谢, 米利

答案 2 :(得分:0)

您似乎拥有JSON格式的数据。你试图从中获取数据的方式非常困难(但可行)。您可以尝试 JSON解析器。它易于学习和使用。您可以找到一个示例here