如何在Java中读取定界文件

时间:2020-01-09 10:35:30  来源:igfitidea点击:

如果我们必须使用Java读取定界文件并进行解析,则可以使用以下两种方法进行操作:

1使用带有useDelimiter()方法的Scanner类。
2使用BufferedReader逐行读取文件,然后使用split()方法拆分每一行。

使用Scanner类读取Java中的分隔文件

扫描程序使用定界符模式将其输入分为令牌,默认情况下,该模式与空格匹配。扫描程序还可以使用除空格以外的分隔符,因为使用了useDelimiter()方法。我们来看一些使用Scanner类读取Java中带分隔符的文件的示例。

在Java中使用扫描仪读取CSV文件

这是一个示例CSV文件,表示帐户发件人,帐户至和转帐金额。

1001,1003,2000
1006,2004,3000
1005,1007,10000

我们要使用Scanner类阅读并解析它以显示字段。

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class ReadDelimited {
  public static void main(String[] args) {
    Scanner sc = null;
    try {
      sc = new Scanner(new File("D:\acct.csv"));

      // Check if there is another line of input
      while(sc.hasNextLine()){
        String str = sc.nextLine();
        // parse each line using delimiter
        parseData(str);
      }
    } catch (IOException  exp) {
      // TODO Auto-generated catch block
      exp.printStackTrace();
    }finally{
      if(sc != null)
        sc.close();
    }	  		
	}
	
  private static void parseData(String str){	
    String acctFrom, acctTo, amount;
    Scanner lineScanner = new Scanner(str);
    lineScanner.useDelimiter(",");
    while(lineScanner.hasNext()){
      acctFrom = lineScanner.next();
      acctTo = lineScanner.next();
      amount = lineScanner.next();
      System.out.println("Account From- " + acctFrom + " Account To- " + acctTo + 
       " Amount- " + amount);  
    }
    lineScanner.close();
  }
}

输出:

Account From- 1001 Account To- 1003 Amount- 2000
Account From- 1006 Account To- 2004 Amount- 3000
Account From- 1005 Account To- 1007 Amount- 10000

使用扫描仪读取Java中用竖线(|)分隔的文件

这是另一个示例Java程序,显示了如何使用Java中的Scanner读取管道定界数据。

1001 | 1003 | 2000
1006 | 2004 | 3000
1005 | 1007 | 10000

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class ReadDelimited {
  public static void main(String[] args) {
    Scanner sc = null;
    try {
      sc = new Scanner( new File("D:\test.txt"));
      
      // Check if there is another line of input
      while(sc.hasNextLine()){
        String str = sc.nextLine();
        // parse each line using delimiter
        parseData(str);
      }
     
    } catch (IOException  exp) {
      // TODO Auto-generated catch block
      exp.printStackTrace();
    }finally{
      if(sc != null)
        sc.close();
    }	  		
  }
	
  private static void parseData(String str){	
    String acctFrom, acctTo, amount;
    Scanner lineScanner = new Scanner(str);
    lineScanner.useDelimiter("\|");
    while(lineScanner.hasNext()){
      acctFrom = lineScanner.next();
      acctTo = lineScanner.next();
      amount = lineScanner.next();
      System.out.println("Account From- " + acctFrom + " Account To- " + acctTo + 
         " Amount- " + amount);  
    }
    lineScanner.close();
  }
}

输出:

Account From- 1001 Account To- 1003 Amount- 2000
Account From- 1006 Account To- 2004 Amount- 3000
Account From- 1005 Account To- 1007 Amount- 10000

由于管道符号是保留字符,因此我们需要对其进行转义,这就是为什么lineScanner.useDelimiter(" \ |");用来。

使用split()方法分割定界数据

在Java中读取分隔文件的另一种方法是逐行读取文件,可以使用BufferedReader读取文件,然后使用split方法分割定界数据。如果我们使用与上面相同的管道分隔文件,则Java示例如下。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadDelimited {
  public static void main(String[] args) {
    BufferedReader br = null;
    try{
       String strLine;
       //FileReader instance wrapped in a BufferedReader
       br = new BufferedReader(new FileReader("D:\test.txt"));
       
       while((strLine = br.readLine()) != null){
         parseData(strLine);
       }
    }catch(IOException exp){
      System.out.println("Error while reading file " + exp.getMessage());
    }finally {
      try {
        // Close the stream
        if(br != null){
          br.close();
        }
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }  		
  }
	
  private static void parseData(String str){	
    String acctFrom, acctTo, amount;
    // parsing using split method
    String[] data = str.split("\|");
    System.out.println("Account From- " + data[0] + " Account To- " + data[1] + 
         " Amount- " + data[2]);  
  }
}

输出:

Account From- 1001 Account To- 1003 Amount- 2000
Account From- 1006 Account To- 2004 Amount- 3000
Account From- 1005 Account To- 1007 Amount- 10000