FieldParser 코드 변경
package parserTest;
import java.util.ArrayList;
import java.util.List;
public class FieldParser implements CSVParser<List<String>>{
private final InternalBuffer buffer;
// private final CSVConfig csvConfig;
private final char[] fieldSeparator;
private final int fieldSeparatorLength;
private final CSVParser<List<String>> commentParser;
private final StringBuilder builder = new StringBuilder();
private final char quote;
private char[] row;
private int limit;
private int pos;
private int matchIndex;
private boolean inQuote;
private boolean isQuoteField;
private List<String> fields;
public FieldParser(InternalBuffer buffer, CSVConfig csvConfig) {
this.buffer = buffer;
this.commentParser = new CommentParser(buffer, csvConfig);
this.fieldSeparator = csvConfig.getFieldSeparator();
this.fieldSeparatorLength = csvConfig.getFieldSeparatorLength();
this.quote = csvConfig.getQuote();
}
private void initialize(){
fields = new ArrayList<>();
limit = buffer.getRowLimit() - fieldSeparatorLength;
row = buffer.getRow();
pos = 0;
matchIndex = 0;
inQuote = false;
isQuoteField = false;
builder.setLength(0);
}
@Override
public List<String> parse() {
initialize();
if (commentParser.canParse()) return commentParser.parse();
for (int cursor = 0; cursor < limit; cursor++) {
processCharacter(cursor);
}
processField(isQuoteField ? limit : limit - pos);
// addField(fields);
return fields;
}
private int getFieldLength(int cursor){
return (matchIndex == 1 ? cursor : cursor - matchIndex + 1) - pos;
}
private void processCharacter(int cursor){
if (row[cursor] == quote) {
inQuote = !inQuote;
isQuoteField = true;
return;
}
if (!inQuote && (matchIndex = incrementIfMatch(fieldSeparator, row[cursor], matchIndex)) == fieldSeparatorLength) {
processField(getFieldLength(cursor));
pos = cursor + 1;
matchIndex = 0;
}
}
private void processField(int length){
if (isQuoteField) {
quoteFieldParse(pos, length);
isQuoteField = false;
}else {
builder.append(row, pos, length);
}
fields.add(builder.toString());
builder.setLength(0);
}
private void quoteFieldParse(int pos, int length) {
int doubleQuote = 0; // 1 이 되면 삭제
pos = pos + 1; // 시작점 찾아야함 근데 TODO 인용부호임을 보장함
int limit = length - 1; // 마지막이 인용부호 인지 확인 -1 TODO 인용부호임을 보장함
for (int cursor = pos; cursor < limit; cursor++) {
char c = row[cursor];
if (c == quote) {
doubleQuote++;
}
if (doubleQuote == 2) {
builder.append(row, pos, cursor - pos);
doubleQuote = 0;
pos = cursor + 1;
}
}
if (pos < limit) {
builder.append(row, pos, limit - pos);
}
}
private void addField(List<String> fields){
fields.add(builder.toString());
}
@Override
public boolean canParse() {
throw new UnsupportedOperationException("this method is Unsupported method");
}
}
Java
복사