[ 
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)

Reply via email to