skip Line에서 order 관리 삭제
기존 order라는 멤버변수에 의하여 Record의 순서를 관리했음.
하지만 return 되는 객체는 List구현체임.
이 때문에 row단위로 파싱이 이루어 질 경우 order의 필요성이 없다고 판단함.
package parserTest;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
public class RecordParser implements CSVParser<List<Record>> {
private final InternalBuffer buffer;
private final CSVConfig csvConfig;
private final CSVParser<List<String>> fieldParser;
private int skipLine;
int matchIndex = 0;
boolean inQuote = false;
public RecordParser(Reader reader, int bufferCapacity ,CSVConfig csvConfig) {
if (bufferCapacity <= 0) throw new IllegalArgumentException("Buffer capacity cannot be less than 1.");
this.buffer = new InternalBuffer(reader, bufferCapacity);
this.csvConfig = csvConfig;
this.fieldParser = new FieldParser(buffer, new CommentParser(buffer, csvConfig),csvConfig);
this.skipLine = csvConfig.getSkipLine();
}
@Override
public List<Record> parse() {
final List<Record> records = new ArrayList<>();
while (buffer.fill()) {
int limit = buffer.getLimit();
for (int cursor = 0; cursor < limit; cursor++) {
char c = buffer.charAt(cursor);
if (c == csvConfig.getQuote()) {
inQuote = !inQuote;
continue;
}
if (!inQuote && (matchIndex = incrementIfMatch(csvConfig.getLineDelimiter(), c, matchIndex)) == csvConfig.getLineDelimiterLength()) {
// buffer 의 길이를 넘어서 matchIndex를 발견할 경우 자르는 위치가 애매해짐 그렇기에 제외해서 넘길 수 없음
// 예를 들면 버퍼의 크기가 1024일때 마지막 (\r)문자열 중 일부만 끝날 경우 뒤의 1024 버퍼에서 matchIndex 만큼 빼버리면 음수가 나옴
if (canParse()){
int length = (matchIndex == 1 ? cursor + matchIndex : cursor + matchIndex - 1) - buffer.getPos();
buffer.mergeOrAppendChars(length);
records.add(new Record(false, fieldParser.parse()));
}
buffer.setNewPosition(cursor + 1);
matchIndex = 0;
buffer.setRowLimit(0);
}
}
if (buffer.notPosAtLimit()) {
buffer.mergeOrAppendChars(buffer.getLimit() - buffer.getPos());
}
}
if (buffer.getRowLimit() != 0){
records.add(new Record(false, fieldParser.parse()));
buffer.setRowLimit(0);
}
return records;
}
@Override
public boolean canParse() {
if (skipLine <= 0){
return true;
}
skipLine--;
return false;
}
}
Java
복사
package parserTest;
import lombok.ToString;
import java.util.List;
@ToString
public class Record {
private boolean isComment;
private List<String> fields;
private int count;
public Record(boolean isComment, List<String> fields) {
this.isComment = isComment;
this.fields = fields;
this.count = fields.size();
}
}
Java
복사