读取由空格分隔的值的多行文本
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
方法。然后你可能想用空格分隔符分割每一行来构造获取每个单独的字段。
【讨论】:
以上是关于读取由空格分隔的值的多行文本的主要内容,如果未能解决你的问题,请参考以下文章