如何从文件中读取字符串并拆分以获取数据字符串?

时间:2018-02-22 00:31:42

标签: java file split

我需要从文件中获取String。我知道如何使用BufferedReader读取整个文件,我知道如何获取类似“Integer:5”的值我可以从中获取Integer 5但我不知道如何做同样的事情并从中获取整个String它。我的意思是,假设我在一个文件中写了“数据:这是一个数据字符串”。我需要知道如何读取字符串并从中获取“This is a data String”。

ES2015

4 个答案:

答案 0 :(得分:0)

您的数据不易使用,只能拆分,而且您的代码也不正确。

1.首先,用“,”分割,你有数据模式 dataName:dataValue

2.接下来,如果你用“:”分割数据,你将面临dataValue也可能包含“:”的问题 和拆分将无法按预期工作。 (我建议用第一个字符':'分开)

3.Inside dataValue还包含带有模式AA的数据:BB - >继续定义规则但在某些情况下拆分无法解决您的规则。 我向您展示了使用Pattern和String获取数据的简单示例(在步骤2中)。

    public static void main (String ...args){
    String input = "Data: Parent data: Child data";
    String regex = "[:]"; // regular expression
    // Using Pattern class
    Pattern pattern = Pattern.compile(regex);
    String output1 = pattern.split(input,2)[1];
    // Using String class
    String output2 = input.split(regex,2)[1];
    System.out.println(output1);
    System.out.println(output2);
  }

如果您想在步骤3中获得更多数据,请了解正则表达式(正则表达式)并查看模式的java doc以了解它的工作原理。之后定义自己的规则来解析原始数据。也许很难,但正则表达式可以完成很多任务。如果有任何问题,至少要再次展示你的研究和问题。

答案 1 :(得分:0)

以下是您问题的答案......

我希望,那个文件实际上看起来并不像那样,导致等待发生的混乱...使它成为单独的行,而不是使用我的代码......它使它变得更简单。 ..

现在你应该知道两件事:

1。)您可以使用以下方法获取String的第二部分:

String text;
String[] scan=text.split(": ");
String ret=scan[1];

这样做是为了分隔包含:的字符串而不是抓取字符串的第二部分......

2。)如果你已经知道将在该字符串中的文字,你可以使用它:

public static String replaceAllString(String s, String a, String b) {
    s.replace(a, b);
    return s;
}

public static void Example() {
    String text;
    text = replaceAllString(line, knownValue, "");

    //knownValue: is the part of the String you DO NOT want in it...
    //line: is the line from the file
}

现在它的作用是它而不是拆分String,它只是抓取String raw,并取消你不想在String中的已知值(这个不会编辑来自文件的行)......

现在,如果你不得不把它与文件一起作为一个巨大的混乱,我推荐这样做:

public static String[] getInfo() {
    //assuming you have already done the file buffer read...
    String[] sep=line.split(", ");
    return sep;
}

public static String grab(String start) {
    String sep=grabInfo();
    String info="";
    for (String s : sep) {
        if (s.contains(start)) {
            String[] c=s.split(start);
            info=c[1];
            break;
        }
    }
    return info;
}

答案 2 :(得分:0)

我认为@ msagala25对他的评论是正确的,最简单的事情之一是使用 Regular Expression (RegEx)来检索1个(或可能更多)特定子字符串中的字符串与Java的 java.util.regex Pattern and Matcher 类一起使用时。

下面是一个方法( getBetween()),演示如何从字符串中检索几乎所有子字符串,为您提供左右字符串标记(可以这么说) 。让我们在你的文本文件中取第二行:

String fileLine = "[Slot Number: 0, Item ID: 399, Item Data: ItemStack{NETHER_STAR x 1, "
                + "UNSPECIFIC_META:{meta-type=UNSPECIFIC, display-name=§6Kit Selector, "
                + "lore=[§eUse this to, §eselect a kit!]}}]";

如果我们希望 399 元素的字符串中 Item ID: 的值,我们的左字符串标记将为: {{ 1}} 和我们的正确字符串标记为: "Item ID:" ,例如:

","

控制台窗口将显示: String leftTag = "Item ID:"; String rightTag = ","; String[] data = getBetween(a, leftTag, rightTag); System.out.println("The Item ID in String is: " + data[0]);

getBetween()方法返回单维字符串数组,唯一的原因是提供的 fileLine 字符串可能包含多组左右字符串标记。可以轻松地增强该方法,以仅返回特定实例或所提供的左和右字符串标记之间的特定实例。目前,如果您知道有多个实例,则需要遍历数组以获取所需的实例。在上面提供的 fileLine 字符串中,我们知道只有一个“项目ID:”的左字符串标记实例,其中包含“的正确字符串标记,” 在提供的 fileLine 字符串中,因此上面的示例代码只使用数组的索引0 来显示所需的内容。

默认情况下,此方法会在将结果放入返回的1D字符串数组之前修剪结果中的任何前导或尾随制表符和/或空格。通过提供布尔值false,可以通过 trimFound 可选参数选择关闭此选项。忽略字母大小写(默认为false)也可以应用,为 ignoreLetterCase 可选参数提供布尔值true(阅读提供的评论部分)。

以下是 getBetween()方法:

The Item ID in String is: 399

如前所述,Pattern / Matcher用于使用正则表达式检索所需的子字符串。根据是否要忽略Letter Case,有两种不同的表达方式。以下是每个表达式的解释:

  

如果字母大小写未被忽略:“\\ Q”+ leftStringTag +   “\\ E(。*?)\\ Q”+ rightStringTag +“\\ E”

enter image description here

  

如果忽略字母大小写:“(?i)\\ Q”+ leftStringTag +   “\\ E(。*?)\\ Q”+ rightStringTag +“\\ E”

enter image description here

答案 3 :(得分:-1)

请查看apache IOUtils的java.nio包,它提供了逐行读取文件的直接方法。读完一行后,您需要使用基于Regex的搜索来从该字符串中获取所需内容。

另外我看到你只是在阅读,直到找到特定的字符串,这是要求吗?

此外,您还没有关闭文件,因此也存在资源泄漏。