Search

2025-01-16

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
복사