Search

2025-01-21

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