package edu.stanford.nlp.sempre.tables.serialize;
import java.io.*;
import java.util.*;
import au.com.bytecode.opencsv.CSVReader;
import edu.stanford.nlp.sempre.tables.StringNormalizationUtils;
import fig.basic.LogInfo;
/**
* Read a table in either CSV or TSV format.
*
* For CSV, this class is just a wrapper for OpenCSV.
* Escape sequences for CSV:
* - \\ => \
* - \" or "" => "
* Each cell can be quoted inside "...". Embed newlines must be quoted.
*
* For TSV, each line must represent one table row (no embed newlines).
* Escape sequences for TSV (custom):
* - \n => [newline]
* - \\ => \
* - \p => |
*
* @author ppasupat
*/
public class TableReader implements Closeable, Iterable<String[]> {
enum DataType { CSV, TSV, UNKNOWN }
CSVReader csvReader = null;
List<String[]> tsvData = null;
public TableReader(String filename) throws IOException {
switch (guessDataType(filename)) {
case CSV:
csvReader = new CSVReader(new FileReader(filename));
break;
case TSV:
parseTSV(filename);
break;
default:
throw new RuntimeException("Unknown data type for " + filename);
}
}
private DataType guessDataType(String filename) {
if (filename.endsWith(".csv"))
return DataType.CSV;
else if (filename.endsWith(".tsv"))
return DataType.TSV;
// Guess from the first line of the file
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String line = reader.readLine();
if (line.contains("\t"))
return DataType.TSV;
else if (line.contains(",") || line.startsWith("\""))
return DataType.CSV;
} catch (IOException e) {
throw new RuntimeException("Unknown data type for " + filename);
}
return DataType.UNKNOWN;
}
private void parseTSV(String filename) {
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String line;
tsvData = new ArrayList<>();
while ((line = reader.readLine()) != null) {
String[] fields = line.split("\t", -1); // Include trailing spaces
for (int i = 0; i < fields.length; i++)
fields[i] = StringNormalizationUtils.unescapeTSV(fields[i]);
tsvData.add(fields);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public Iterator<String[]> iterator() {
if (csvReader != null) return csvReader.iterator();
else return tsvData.iterator();
}
@Override
public void close() throws IOException {
if (csvReader != null) csvReader.close();
}
// ============================================================
// Test
// ============================================================
public static void main(String[] args) {
String filename = "t/csv/200-csv/0.tsv";
LogInfo.logs("%s", filename);
try (TableReader tableReader = new TableReader(filename)) {
for (String[] x : tableReader) {
LogInfo.begin_track("ROW");
for (String y : x) LogInfo.logs("|%s|", y);
LogInfo.end_track();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}