Java解析文本文件并获取单词和字符之间的所有单词

时间:2017-06-14 18:33:21

标签: java string file

我正在尝试编写java代码来解析文本文件并获取单词和字符之间的所有单词。

使用下面的文字,我需要在" commercial"之间找到所有单词。和角色" |"。在这种情况下,正确的输出将是机器人,真实,保险和面纱。

  /tony/ |
  /adam/ /real/ /farce/ |
  /boat/ /rds/ /dbb/ /Pilot/ /Registry/ |
  /commercial/ /bot/ /real/ /insurance/ /veil/ |
  /commerce/ /health/ /insurance/ /yes/ |  
  /Clalit/ /Health/ |
  /congenital/ /anomaly/ |
  /Danish/ /beef/ /street/ | /Danish/ /bee/  | /no/ 
  /registry/ |
  /car/ | /Danish/ /spot/ |

我是java的新手并尝试编写java代码,但我没有接近它。

public static void parseText() throws FileNotFoundException, IOException {
    //String fullDatabaseNameString = "";

    String line;

    try (
            InputStream fis = new FileInputStream("text.txt");
            InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8"));
            BufferedReader br = new BufferedReader(isr);) {
        while ((line = br.readLine()) != null) {
            // Do your thing with line
            String[] words = line.split(" ");
            for (String s : words) {
                String wordStripped = s.replace("/", "");

                if (wordStripped.equals("Danish")) {

                    if (wordStripped.equals("|")) {
                        break;
                    }
                }

            }

        }
    }

}

2 个答案:

答案 0 :(得分:1)

首先,你说你是Java新手。你是一般的编程新手吗?我将尝试使用常用工具(如字符串数组,文件解析和字符串比较)来指导您制作自己的解决方案。

你有正确的想法。首先,你应该考虑一下你想做什么。你的任务布局清楚。

  

获取"商业"之间的所有单词和角色" |"

太棒了!现在我们需要弄清楚如何处理这个问题。我们有这个文件:

  /tony/ |
  /adam/ /real/ /farce/ |
  /boat/ /rds/ /dbb/ /Pilot/ /Registry/ |
  /commercial/ /bot/ /real/ /insurance/ /veil/ |
  /commerce/ /health/ /insurance/ /yes/ |  
  /Clalit/ /Health/ |
  /congenital/ /anomaly/ |
  /Danish/ /beef/ /street/ | /Danish/ /bee/  | /no/ 
  /registry/ |
  /car/ | /Danish/ /spot/ |

现在正如你所说,你知道答案。你应该得到机器人,真实,保险和面纱。 现在你把文件打开了。你需要告诉你的程序在哪里看。现在你的代码丢失的地方就是你要在这里做的事情。你想怎么接近这个?看着它几秒钟,我会扫描每个角色。如果你看到" /"开始你的话。把你得到的每个角色都放到一个字符串中,直到你看到" /"再次。这可能是一个字符串数组。

有几种方法你可以在几行中做到这一点,我认为你是编程的新手,也许你还没有学习模式等等。所以我们坚持基本。

接下来,你要寻找角色" |"。您可以将它作为自己的单词存储在数组中。这将是你换线的指南。

完成解析文件后,您将拥有一个一维数组,每个索引都有一个单词。那么只需要将数组与你的单词进行比较,然后迭代直到看到" |"打印时。

有更简单的方法,但我觉得这是一种非常有条理和很好的学习工具。

我的意思是使用您的代码启动。

package so;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class Fileparser {

    public static void main(String[] args) throws FileNotFoundException, IOException {
        parseText();

    }

    public static void parseText() throws FileNotFoundException, IOException {
        // String fullDatabaseNameString = "";

        String line;

        try (
                InputStream fis = new FileInputStream("C:\\Dev\\workspace\\so\\src\\so\\file.txt");
                InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8"));
                BufferedReader br = new BufferedReader(isr);
            ) {
            while ((line = br.readLine()) != null) {
                String[] words = line.split(" ");
                for (int i = 0; i < words.length; i++) {
                    if(words[i].equals("/commercial/")) {
                        i++;
                        while(!words[i].equals("|")) {
                            System.out.print(words[i]);
                            i++; //Don't forget to check your index to be sure you are never out of bounds! Not done here.
                            //You can also remove the "/" caracter if needed.
                        }

                    }
                }
            }

        }
    }

希望它有所帮助! 的输出

/bot//real//insurance//veil/

答案 1 :(得分:0)

您可以使用正则表达式来解决您的问题,这是一个简单的解决方案:

String content = new Scanner(new File("file.txt")).useDelimiter("\\Z").next();//<----(1)

Pattern pattern = Pattern.compile( Pattern.quote("commercial") 
 + "(.*?)" + Pattern.quote("|"));//<-----(2)
Matcher matcher = pattern.matcher(content);
String[] result;
while (matcher.find()) {
   result = matcher.group(1).replaceAll("[^a-zA-Z0-9 ]", "").trim().split("\\s+");//<--(3)
    System.out.println(Arrays.toString(result));
}
  • (1)用一个字符串
  • 读取文件的所有内容
  • (2)使用此正则表达式commercial(.*?)\\|获取(commercial and |)
  • 之间的所有内容
  • (3)将所有不是alphanumirique或空格的东西替换为空,这样你就可以只提取单词然后使用split \s+逐字逐句获取,输入结果为:

<强>输出

[bot, real, insurance, veil]