import java.util.Iterator;
import java.util.List;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
public class TsvReader implements Iterable<Map<String, String>> {
private String filename;
public TsvReader(String filename) {
this.filename = filename;
}
@Override
public Iterator<Map<String,String>> iterator() {
try { return new Iter(); }
catch (FileNotFoundException e) {
throw new IllegalArgumentException("file not found: " + filename);
}
}
private class Iter implements Iterator<Map<String, String>> {
private BufferedReader file;
private List<String> headings;
private String curLine = null;
public Iter() throws FileNotFoundException {
file = new BufferedReader(new java.io.FileReader(filename));
headings = new java.util.ArrayList<>();
for (String heading : peekLine().split("\t"))
headings.add(heading);
curLine = null;
}
private String peekLine() {
if (curLine == null) {
try { curLine = file.readLine(); }
catch (java.io.IOException e) { }
if (curLine != null) curLine = curLine.trim();
}
return curLine;
}
public boolean hasNext() {
return peekLine() != null;
}
public Map<String,String> next() {
Map<String,String> map = null;
String[] parts = peekLine().split("\t");
for (int i = 0; i < headings.size() && i < parts.length; i++)
map.put(headings.get(i), parts[i]);
curLine = null;
return map;
}
}
}