blob: f3ce231edad6bbddd0a34adf4195a60570e4b92e [file] [log] [blame]
/**
*******************************************************************************
* Copyright (C) 1996-2001, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/unicodetools/com/ibm/text/utility/FileLineIterator.java,v $
* $Date: 2003/02/25 23:38:22 $
* $Revision: 1.2 $
*
*******************************************************************************
*/
package com.ibm.text.utility;
import java.util.*;
import java.text.*;
import java.io.*;
import com.ibm.icu.text.UnicodeSet;
import com.ibm.icu.text.UTF16;
import com.ibm.icu.text.Replaceable;
import com.ibm.icu.text.ReplaceableString;
import com.ibm.icu.text.UnicodeMatcher;
import com.ibm.text.UCD.*;
/**
* Opens a file, and iterates through the lines in the file.
* Options allow trimming and comment handling, and splitting
*/
public class FileLineIterator {
static public final char NOTCHAR = '\uFFFF';
// public writable
public boolean doCounter = true;
public int lineLimit = Integer.MAX_VALUE;
public char commentChar = '#'; // NOTCHAR if no comments
public boolean showFilename = true;
// public readable
public String originalLine = "";
public String cleanedLine = "";
public int counter = 0;
private BufferedReader br = null;
private Utility.Encoding encoding = Utility.UTF8;
/**
* Open the file for reading. If useGenDir is set, use the normal generation directory
*/
public void open(String filename, Utility.Encoding encoding) throws IOException {
if (showFilename) {
Utility.fixDot();
System.out.println("Reading File: " + new File(filename).getCanonicalPath());
}
br = Utility.openReadFile(filename, encoding);
this.encoding = encoding;
}
/**
* Fetch a non-zero-length line from the file, stripping comments & using counter, according to settings.
*/
public String read() throws IOException {
while (true) {
if (counter >= lineLimit) return null;
cleanedLine = originalLine = br.readLine();
if (doCounter) Utility.dot(counter++);
if (cleanedLine == null) return null;
// drop BOM
if (encoding == Utility.UTF8 && counter == 0 && cleanedLine.length() > 0 && cleanedLine.charAt(0) == 0xFEFF) {
cleanedLine = cleanedLine.substring(1);
}
// drop comment
if (commentChar != NOTCHAR) {
int commentPos = cleanedLine.indexOf(commentChar);
if (commentPos >= 0) cleanedLine = cleanedLine.substring(0, commentPos);
}
cleanedLine = cleanedLine.trim();
if (cleanedLine.length() != 0) return cleanedLine;
}
}
public int readSplit(String[] results, char delimiter) throws IOException {
String line = read();
if (line == null) return 0;
return Utility.split(line, delimiter, results);
}
public void close() throws IOException {
Utility.fixDot();
br.close();
}
}