读取由空格分隔的值的多行文本

Posted

技术标签:

【中文标题】读取由空格分隔的值的多行文本【英文标题】:Read multiline text with values separated by whitespaces 【发布时间】:2011-04-29 20:43:43 【问题描述】:

我有以下测试文件:

Jon Smith 1980-01-01
Matt Walker 1990-05-12

解析这个文件的每一行,用 (name, surname,birthdate) 创建对象的最佳方法是什么?当然这只是一个示例,真实的文件有很多记录。

【问题讨论】:

你学到了什么?通常在学校至少对我来说是扫描仪课。这将有助于确定最适合您的方法。 本来打算用scanner,但是比较感兴趣是用StringTokenizer还是StreamTokenizer。 你也可以使用分词器。基本上扫描该行,然后使用带有空格分隔符的标记器。 StringTokenizer st = new StringTokenizer("这是一个测试"); while (st.hasMoreTokens()) System.out.println(st.nextToken()); 【参考方案1】:
 import java.io.*;
 class Record

   String first;
   String last;
   String date;

  public Record(String first, String last, String date)
       this.first = first;
       this.last = last;
       this.date = date;
  

  public static void main(String args[])
   try
    FileInputStream fstream = new FileInputStream("textfile.txt");
    DataInputStream in = new DataInputStream(fstream);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String strLine;
    while ((strLine = br.readLine()) != null)   
       String[] tokens = strLine.split(" ");
       Record record = new Record(tokens[0],tokens[1],tokens[2]);//process record , etc
    
    in.close();
     catch (Exception e)
      System.err.println("Error: " + e.getMessage());
    
 

【讨论】:

我将在一分钟内更新此代码以包含对象的创建。 @Brandon - 这个问题显然有一个“家庭作业”标签......我不认为你通过放弃完整的解决方案让@mastodon 的生活变得更好。 eep,很抱歉泄露了答案。 虽然我将使用我之前计划的 Scanner 解决方案,但我选择了您的答案,因为它是最彻底的。 奇怪,我的回答解释了一切,没有显示任何代码(我觉得这可能是家庭作业问题的最佳回答)。嗯,只要你一路上学到一些东西:-)【参考方案2】:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ScannerReadFile 
    public static void main(String[] args) 
        //
        // Create an instance of File for data.txt file.
        //
        File file = new File("tsetfile.txt");

        try 
            //
            // Create a new Scanner object which will read the data from the 
            // file passed in. To check if there are more line to read from it
            // we check by calling the scanner.hasNextLine() method. We then
            // read line one by one till all line is read.
            //
            Scanner scanner = new Scanner(file);
            while (scanner.hasNextLine()) 
                String line = scanner.nextLine();
                System.out.println(line);
            
         catch (FileNotFoundException e) 
            e.printStackTrace();
        

    

这个:

            while (scanner.hasNextLine()) 
                String line = scanner.nextLine();

也可以改成

        while (scanner.hasNext()) 
            String line = scanner.next();

哪个会读取空格。

你可以这样做

Scanner scanner = new Scanner(file).useDelimiter(",");

自定义分隔符

在发帖时,您现在可以通过三种不同的方式来执行此操作。在这里你只需要解析你需要的数据。您可以阅读该行,然后逐一拆分或阅读,所有 3 将是一个新行或一个新人。

【讨论】:

【参考方案3】:

乍一看,我建议 StringTokenizer 在这里是你的朋友,但如果有一些实际的经验,在商业应用程序中,你可能不能保证姓氏是一个单一的名字(即某人有双桶装姓氏,不连字符会引起问题。

如果你能保证数据的完整性,那么你的代码就是

BufferedReader read = new BufferedReader(new FileReader("yourfile.txt"));
String line = null;
while( (line = read.readLine()) != null) 
   StringTokenizer tokens = new StringTokenizer(line);
   String firstname = tokens.nextToken();
   ...etc etc

如果你不能保证你的数据的完整性,那么你需要找到第一个空格,并选择在它之前的所有字符作为姓氏,找到最后一个空格和之后的所有字符作为 DOB,以及中间的所有字符是姓氏。

【讨论】:

【参考方案4】:

使用FileReader 从文件中读取字符,使用BufferedReader 缓冲这些字符,以便您可以将它们读取为行。然后你有一个选择。我个人会使用String.split() 来分割空白,给你一个很好的字符串数组,你也可以标记这个字符串。

当然,您必须考虑如果有人有中间名之类的会发生什么。

【讨论】:

【参考方案5】:

查看BufferedReader 类。它有readLine 方法。然后你可能想用空格分隔符分割每一行来构造获取每个单独的字段。

【讨论】:

以上是关于读取由空格分隔的值的多行文本的主要内容,如果未能解决你的问题,请参考以下文章

读取行和处理数据

如何在 C++ 中读取由空格分隔的字符串? [关闭]

从制表符分隔的 xls 文件中读取数据

在R中读取具有多个空格作为分隔符的文本文件

文本IO 二进制IO

使用流在 C++ 中读取可变长度输入