【问题标题】:Split text file into Strings on empty line将文本文件拆分为空行上的字符串
【发布时间】:2012-04-21 09:27:01
【问题描述】:

我想读取一个本地的 txt 文件并读取该文件中的文本。之后,我想将整个文本拆分为字符串,如下例所示。

示例: 假设文件包含-

 abcdef                                 
 ghijkl

 aededd               
 ededed

 ededfe
 efefeef
 efefeff

 ......
 ......

我想将此文本拆分为字符串

s1 = abcdef+"\n"+ghijkl;

s2 = aededd+"\n"+ededed; 

s3 = ededfe+"\n"+efefeef+"\n"+efefeff;

........................

我的意思是我想在空行上分割文本。

我确实知道如何读取文件。我需要帮助将文本拆分为字符串

【问题讨论】:

  • 您确定读取整个文件然后拆分这么长的字符串是个好主意吗?我建议您改为逐行阅读,将它们附加到 StringBuilder\n 直到阅读空行。
  • string.split("\n\r") 找到这个答案here

标签: java regex split


【解决方案1】:

@Kevin 代码运行良好,正如他提到的代码未经测试,这里是需要的 3 处更改:

1.(tmp==null)的if检查应该在前,否则会出现空指针异常。

2.此代码省略了添加到 ArrayList 的最后一组行。为了确保添加最后一个,我们必须在 while 循环之后包含以下代码: if(!str.isEmpty()) { allStrings.add(str); }

3.str += "\n" + tmp;;如果是 \\n,则应改为使用 \n。请看这个帖子的结尾,我已经添加了整个代码以便它可以提供帮助

BufferedReader in
   = new BufferedReader(new FileReader("foo.txt"));

List<String> allStrings = new ArrayList<String>();
String str ="";
List<String> allStrings = new ArrayList<String>();
        String str ="";
        while(true)
        {
            String tmp = in.readLine();
            if(tmp==null)
            {
                break;
            }else if(tmp.isEmpty())
            {
                if(!str.isEmpty())
                {
                    allStrings.add(str);
                }
                str= "";
            }else
            {
                if(str.isEmpty())
                {
                    str = tmp;
                }
                else
                {
                    str += "\n" + tmp;
                }
            }

        }
        if(!str.isEmpty())
        {
            allStrings.add(str);
        }

【讨论】:

    【解决方案2】:

    这可能取决于文件的编码方式,因此我可能会执行以下操作:

    String.split("(\\n\\r|\\n|\\r){2}");
    

    一些文本文件将换行符编码为“\n\r”,而另一些可能只是“\n”。连续两个新行意味着你有一个空行。

    【讨论】:

    • 这个错误地在\r\n上分裂,因此不起作用。
    【解决方案3】:

    Godwin 走在了正确的轨道上,但我认为我们可以将这项工作做得更好一些。在 regx 中使用 '[ ]' 是一个或,所以在他的例子中,如果你有一个 \r\n 那将只是一个新行而不是一个空行。正则表达式会在 \r 和 \n 上拆分它,我相信在示例中我们正在寻找一个空行,它需要一个 \n\r\n\r,一个 \r\n\ r\n、\n\r\r\n、\r\n\n\r、或\n\n或\r\r

    所以首先我们要查找 \n\r 或 \r\n 两次,两者的任意组合都是可能的。

    String.split(((\\n\\r)|(\\r\\n)){2}));
    

    接下来我们需要寻找后面没有\n的\r

    String.split(\\r{2});
    

    最后,让我们对\n做同样的事情

    String.split(\\n{2});
    

    所有这些都应该是

    String.split("((\\n\\r)|(\\r\\n)){2}|(\\r){2}|(\\n){2}");

    注意,这仅适用于使用新行和字符返回的非常具体的示例。我在 ruby​​ 中可以执行以下操作,这将包含更多案例。我不知道Java中是否有等价物。

    .match($^$)
    

    【讨论】:

      【解决方案4】:

      我会建议更通用的正则表达式:

      text.split("(?m)^\\s*$");
      

      在这种情况下,它可以在任何行尾约定下正常工作,并且还可以处理相同的空行和仅空格行。

      【讨论】:

        【解决方案5】:

        即使有用数据之间有超过 2 个空行,下面的代码也能正常工作。

        import java.util.regex.*;
        
        // read your file and store it in a string named str_file_data
        
        Pattern p = Pattern.compile("\\n[\\n]+");     /*if your text file has \r\n as the newline character then use Pattern p = Pattern.compile("\\r\\n[\\r\\n]+");*/
        String[] result = p.split(str_file_data);
        

        (我没有测试代码,所以可能有错别字。)

        【讨论】:

          【解决方案6】:

          你可以将一个字符串拆分成一个数组

          String.split();
          

          如果你想要换行的话,那就是

          String.split("\\n\\n");
          

          更新*

          如果我明白你在说什么,那么约翰。

          那么你的代码基本上就是

          BufferedReader in
             = new BufferedReader(new FileReader("foo.txt"));
          
          List<String> allStrings = new ArrayList<String>();
          String str ="";
          while(true)
          {
              String tmp = in.readLine();
              if(tmp.isEmpty())
              {
                if(!str.isEmpty())
                {
                    allStrings.add(str);
                }
                str= "";
              }
              else if(tmp==null)
              {
                  break;
              }
              else
              {
                 if(str.isEmpty())
                 {
                     str = tmp;
                 }
                 else
                 { 
                     str += "\\n" + tmp;
                 }
              }
          }
          

          可能是您要解析的内容。

          其中 allStrings 是所有字符串的列表。

          【讨论】:

          • 我认为双线的模式应该是\\n\\n。
          • 不在新行上我想在空行上拆分字符串,因为字符串可以是任意数量的行。
          • 请看更新的问题字符串可以是任意行数。
          • 这个答案会起作用,因为它只有在找到两个换行符(例如空行)时才会拆分。
          • @johnsmith 我已经更新了我的答案,但请注意这未经测试
          猜你喜欢
          • 1970-01-01
          • 2017-02-02
          • 2021-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-30
          • 1970-01-01
          相关资源
          最近更新 更多