[ https://issues.apache.org/jira/browse/CRUNCH-414?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14044727#comment-14044727 ]
mac champion commented on CRUNCH-414: ------------------------------------- Oh I see, so it's not just spawning tons of StringBuilder objects to be garbage collected later. Got it. How about this? {code} StringBuilder stringBuilder = null; do { totalBytesConsumed += readFileLine(inputText); // a line has been read. We need to see if we're still in quotes and tack // on a newline if so if (currentlyInQuotes && !endOfFile) { if (stringBuilder == null) { stringBuilder = new StringBuilder(); } // If we end up in a multi-line record, we need to build it. Grab what's inputText and append it to the // builder, append a newline, and set inputText to the result after it's built. stringBuilder.append(inputText.toString()).append('\n'); } if (totalBytesConsumed > maximumRecordSize || totalBytesConsumed > Integer.MAX_VALUE) { LOGGER.error("Possibly malformed file encountered. First line of record: " + inputText.toString()); throw new IOException("Possibly malformed file encountered. Check log statements for more information"); } } while (currentlyInQuotes && !endOfFile); if (stringBuilder != null) { input.set(stringBuilder.toString()); } else { input.set(inputText); } return (int) totalBytesConsumed; } {code} This way, a StringBuilder isn't even created unless a multi-line record has definitely been encountered. Then, it's reused until the record is fully read. At the end, if a StringBuilder has been created, its value is used. Otherwise, the line in inputText is used. I'll work on making the threshold configurable later, I think it will have to be injected into the constructor. > The CSV file source needs to be a little more robust when handling multi-line > CSV files > --------------------------------------------------------------------------------------- > > Key: CRUNCH-414 > URL: https://issues.apache.org/jira/browse/CRUNCH-414 > Project: Crunch > Issue Type: Improvement > Components: Core > Affects Versions: 0.8.3 > Reporter: mac champion > Assignee: mac champion > Priority: Minor > Labels: csv, csvparser > Fix For: 0.8.4 > > Original Estimate: 336h > Remaining Estimate: 336h > > Brandon Inman recently reported an undesriable behavior in the CSV file > source group of files. Currently, the CSVLineReader, if reading a malformed > CSV file, can enter a state where it is perpetually waiting for an end-quote > character. As he put it, "Malformed files are malformed files and should > probably fail in some regard, but a hang is obviously undesirable." > Essentially, the CSVLineReader needs to be tweaked in such a way that an > informative exception is thrown after some threshold is reached, instead of > basically just hanging. -- This message was sent by Atlassian JIRA (v6.2#6252)