/*
* 練習問題22.11 p.573
* Scannerではなく、StreamTokenizerを使用したreadCSVTableを書きなさい
*/
/*
* 練習問題22.8 p.570
* 現状では、readCSVTableは、それが期待する入力形式に関して、厳格すぎると同時に寛容すぎます。
* 入力の終わりに空行があるとIOExceptionをスローしますので、厳格すぎます。
* 4つ以上のカンマを持つ行でも例外が発生しませんので、寛容すぎます。
* この両方の問題を修正しなさい。
*/
/*
* 練習問題22.7 p.570
* 期待されるデータのセル数を引数として渡せるようにreadCSVTableを書き直しなさい。
*/
package ch22.ex22_11;
import java.io.IOException;
import java.io.Reader;
import java.io.StreamTokenizer;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
public class EX2211
{
public static List<String[]> readCSVTable(Reader source, int cellsNumber)
throws IOException
{
StreamTokenizer st = new StreamTokenizer(source);
st.quoteChar(',');
st.ordinaryChars('0', '9');
st.wordChars('0', '9');
st.wordChars('.', '.');
st.wordChars('-', '-');
st.eolIsSignificant(true);
List<String[]> vals = new ArrayList<String[]>();
int count = 0;
st.nextToken();
while(st.ttype != StreamTokenizer.TT_EOF)
{
String[] cells = new String[cellsNumber];
count = 0;
while(st.ttype != StreamTokenizer.TT_EOL)
{
if (count >= cellsNumber)
{
throw new IOException("input format error, count = " + count);
}
if (st.ttype == StreamTokenizer.TT_WORD || st.ttype == ',')
{
cells[count++] = st.sval;
}
st.nextToken();
}
if (count > 0)
{
if (count == cellsNumber)
{
vals.add(cells);
}
else
{
throw new IOException("input format error, count = " + count);
}
}
st.nextToken();
}
return vals;
}
public static void main(String[] args)
{
// StringReader test = new StringReader("a,b,c\nd,e,f\n\ng,h,i\n\n"); // input format error case
// StringReader test = new StringReader("a,b,c,d\ne,f,g\nh,i,j\n\n"); // comma number incorrect case
// StringReader test = new StringReader("a,b\ne,f,g\nh,i,j\n\n"); // comma number incorrect case
StringReader test = new StringReader("a,b,c\nd,e,f\n70.0,8,9\n\n"); // normal case
List<String[]> result = null;
try
{
result = EX2211.readCSVTable(test, 3);
for (int i = 0; i< result.size(); i++)
{
System.out.print(i + ": ");
for (int j = 0; j < result.get(i).length; j++)
{
System.out.print(result.get(i)[j] + " ");
}
System.out.println("");
}
}
catch (Exception e)
{
System.out.println(e);
}
}
}