首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java,如何在此输入文本文件之间正确分割多个空白空间?

Java,如何在此输入文本文件之间正确分割多个空白空间?
EN

Stack Overflow用户
提问于 2022-10-10 09:05:38
回答 3查看 99关注 0票数 -1

所以我得到了这份文件:

代码语言:javascript
复制
A-4     09-20-2083  B/2
A/4     04/27/2048  C-2
A/2b     1/24/75    A/4b
A/4     05/07/2049  A/2b
A/2b     7/ 3/31    B/2
A/2b     5/11/53    B-4b
C-4     14-07-2051  A/2
C-2b    22-12-44    A/4
C-4b    11-11-2055  C.2
A/2b     5/11/16    C-2
C.4     08.01.2058  A-4b
B-4b    2010-11- 2  B/2b
B/2b    26/ 3/13    A-4b
C-2     18-06-06    B-4
C.2     08.08.09    C-2
A/2     01/20/99    B-2b
C.4     18.08.2077  B/2
A-4b    10-21-2086  B/4b
B/2b    50/ 2/ 5    A/2
A/4     03/08/2001  A-2b
A/4b    11/ 8/2085  B/4
A/4     03/19/2058  C.2b
A/4b     6/18/2051  B-2
A-4     03-01-2001  B-2b
A-4     02-14-2066  C-4
A/2     06/23/48    A-4
C-4b    18- 8-2065  B/2b
C-2     06-04-94    B/4
B/4b    2057/ 9/21  A-2b
C.2b    21. 8.31    A/2b
A/4b    11/13/2098  A/4
A/2     04/31/63    C-2
B/2b    22/ 5/ 7    A-2
C-4     11-09-2032  B/4b
C.4     08.05.2085  B-2
B-4     2038-10-22  C.4
A/2     03/09/37    C.2b
A/2b     4/ 9/21    A/4
C.2b     3.12.95    B-4
C-4b    26- 1-2004  C-2

如你所见,一些日期或行有随机的空格..。那么,如何使用regex或任何其他读取器正确地读取此输入?非常感谢!

EN

回答 3

Stack Overflow用户

发布于 2022-10-10 09:10:37

读取文件中的每一行,然后在拆分方法中使用regex“\s+”(多个空格的字符集)分隔它们。

编辑:我的坏消息,没有注意到日期值的空格。您可以使用“{2,}”作为对2个或2个以上空格的正则表达式。

这是从文件中检索每个数据的完整代码。

代码语言:javascript
复制
public static void read(String fileName){
    //create file object
     File file = new File(fileName);
     
     //create file reader
    FileReader fileReader = null ;
    
    //define buffered reader
    BufferedReader bufferedReader = null ;
    
    try {
        fileReader = new FileReader(file);
        bufferedReader = new BufferedReader(fileReader);
        
        String line;
        
        while((line = bufferedReader.readLine()) != null){
            
            //split lines into tokens (values) based on whitespace using regular expression "[ ]{2,}"
            //to indicate two ore more instances of whitespace
            String[] dataArray = line.trim().split("[ ]{2,}");
            
            
        
            //iterate over array of strings
            for(int i = 0 ; i< dataArray.length ; i++) {
                
                //get each value as a string
                String dateString = dataArray[i];
                if(i==1) {
                    System.out.println(dateString);
                }//prints out date in each line 
            }
        }   
    } catch (FileNotFoundException e) {
        // gets and prints filename
        System.out.println("Sorry, " + file.getName() + " not found.");
    } catch (IOException e) {
        // prints the error message and info about which line
        e.printStackTrace();
    }finally {
        
        //regardless, close file objects
        try {
            fileReader.close();
            bufferedReader.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

}
票数 0
EN

Stack Overflow用户

发布于 2022-10-10 10:28:23

这里有一个快速而肮脏的解决方案,只需使用扫描仪即可工作。有些边缘情况可能会失败,但至少对给定的输入是这样的,而且对于某些变化的输入,它似乎很好。

代码语言:javascript
复制
import java.util.Scanner;
import java.util.Arrays;

class Main
{
  public static void main (String args[])
  {

    String input =
      "A-4     09-20-2083  B/2\nA/4     04/27/2048  C-2\nA/2b     1/24/75    A/4b\nA/4     05/07/2049  A/2b\nA/2b     7/ 3/31    B/2\nA/2b     5/11/53    B-4b\nC-4     14-07-2051  A/2\nC-2b    22-12-44    A/4\nC-4b    11-11-2055  C.2\nA/2b     5/11/16    C-2\nC.4     08.01.2058  A-4b\nB-4b    2010-11- 2  B/2b\nB/2b    26/ 3/13    A-4b\nC-2     18-06-06    B-4\nC.2     08.08.09    C-2\nA/2     01/20/99    B-2b\nC.4     18.08.2077  B/2\nA-4b    10-21-2086  B/4b\nB/2b    50/ 2/ 5    A/2\nA/4     03/08/2001  A-2b\nA/4b    11/ 8/2085  B/4\nA/4     03/19/2058  C.2b\nA/4b     6/18/2051  B-2\nA-4     03-01-2001  B-2b\nA-4     02-14-2066  C-4\nA/2     06/23/48    A-4\nC-4b    18- 8-2065  B/2b\nC-2     06-04-94    B/4\nB/4b    2057/ 9/21  A-2b\nC.2b    21. 8.31    A/2b\nA/4b    11/13/2098  A/4\nA/2     04/31/63    C-2\nB/2b    22/ 5/ 7    A-2\nC-4     11-09-2032  B/4b\nC.4     08.05.2085  B-2\nB-4     2038-10-22  C.4\nA/2     03/09/37    C.2b\nA/2b     4/ 9/21    A/4\nC.2b     3.12.95    B-4\nC-4b    26- 1-2004  C-2\n";

    Scanner scanner = new Scanner(input);

    while (scanner.hasNextLine())
    {

            String line = scanner.nextLine().trim();

            String[] words = line.split(" ");
            String[] filtered = Arrays.stream(words).filter(s -> !s.isEmpty()).toArray(String[]::new);

            String first = filtered[0].trim ();
            String third = filtered[filtered.length - 1].trim();

            String[] dateArray = Arrays.copyOfRange(filtered, 1, filtered.length - 1);
            String second =  String.join("", dateArray);

            System.out.println (first + "||" + second + "||" + third);
    
   }

   scanner.close();
  }
}
票数 0
EN

Stack Overflow用户

发布于 2022-10-10 12:26:52

如果你需要快速写作的话..。

代码语言:javascript
复制
String input = Files.readString(Path.of("path\\to\\your\\file.txt"));
//try-catch block omitted
Pattern.compile("(.+?)\\s+(.+?)\\s+(.+?)\\s*\n")
        .matcher(input)
        .results()
        .map(m -> {
            String firstGroupWithLetter = m.group(1);   //"A-4" from first line
            String date = m.group(2);                   //"09-20-2083"
            String secondGroupWithLetter = m.group(3);  //"B/2"
            // m.group(0) is reserved for full match result or kind of that

            // Do whatever you want
            return null;
        })
        // further actions
        ;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74012495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档