繁体   English   中英

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

[英]Java parse text file and get all words between word and character

我正在尝试编写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;
                    }
                }

            }

        }
    }

}

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

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)将所有内容(不是字母数字或空格)替换为空,以便可以仅提取单词,然后使用\\s+拆分以逐字获取单词,对于您的输入,输出为:

产量

[bot, real, insurance, veil]

首先,您说过您是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/ |

现在,正如您所说,您知道答案了。 您应该得到机器人,真实,保险和面纱。 现在您打开了正确的文件。 您需要告诉您的程序在哪里看。 现在您的代码有点丢失,这就是您要在此处执行的操作。 您想如何处理? 看着它几秒钟,我将扫描每个字符。 如果看到“ /”,请重新开始。 将您输入的每个字符放入字符串中,直到再次看到“ /”为止。 那可能是一个字符串数组。

有几种方法可以在几行中完成此操作,假设您是编程新手,也许您还没有学习过模式等。 所以让我们坚持基本。

接下来,寻找字符“ |”。 您可以将其作为自己的单词存储在数组中。 这将是您换线的指南。

解析完文件后,您将拥有一个一维数组,每个索引处都有一个单词。 那么只需将数组与您的单词进行比较,然后迭代直到看到“ |”即可 在打印它们时。

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

这就是我使用您的代码开始的意思。

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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM