package com.akjava.lib.common.csv;
import java.util.ArrayList;
import java.util.List;
import com.google.common.base.Preconditions;
public class NewCSVReader {
private String lines;
private char separator;
private char quotechar;
public NewCSVReader(String lines){
this(lines,'\t','"');
}
public NewCSVReader(String lines,char separator, char quotechar){
Preconditions.checkNotNull(lines);
Preconditions.checkArgument(separator!=quotechar);
Preconditions.checkArgument(separator!='\r');
Preconditions.checkArgument(separator!='\n');
Preconditions.checkArgument(quotechar!='\r');
Preconditions.checkArgument(quotechar!='\n');
this.lines=lines;
this.separator=separator;
this.quotechar=quotechar;
}
public NewCSVReader(String lines, char separator) {
this(lines,separator,'"');
}
public List<List<String>> readAllAsList(){
List<List<String>> result=new ArrayList<List<String>>();
List<String> columns=new ArrayList<String>();
String values="";
boolean inQuote=false;
boolean inText=false;
for(int i=0;i<lines.length();i++){
char ch=lines.charAt(i);
if(ch==quotechar){
if(inQuote){
//check escaped
if(i+1<lines.length()){
char next=lines.charAt(i+1);
if(next==quotechar){//escaped
values+=ch;
//values+=next;
++i;//skip
//System.out.println("inQuote but next is not quote");
continue;
}else{
//System.out.println("inQuote but next is not quote:"+next);
}
}
//System.out.println("set inQuote=false");
inQuote=false;
}else{
//skip
if(inText){
System.out.println("inText");
values+=ch;
}else{
// System.out.println("set inQuote=true");
inQuote=true;
}
}
}else if(ch==separator){
if(inQuote){//inQuote separator ignored
values+=ch;
}else{
//value break
columns.add(values);
values="";
inText=false;
}
}else if(ch=='\r'){
if(inQuote){//inQuote separator ignored
values+=ch;
}else{
if(i+1<lines.length()){
char next=lines.charAt(i+1);
if(next=='n'){//line-break
columns.add(values);
values="";
result.add(columns);
columns=new ArrayList<String>();
continue;
}
}
values+=ch;
}
}else if(ch=='\n'){//line break
if(inQuote){//inQuote separator ignored
values+=ch;
}else{
columns.add(values);
values="";
result.add(columns);
columns=new ArrayList<String>();
inText=false;
}
}else{
values+=ch;
if(!inQuote){
inText=true;
}
}
}
if(!values.isEmpty()){
columns.add(values);
}
if(!columns.isEmpty()){
result.add(columns);
}else{
//line end
columns.add("");//at least one
result.add(columns);
}
return result;
}
}