java-操作csv文件

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.Charset;

public class CsvWriter {
    private Writer outputStream;
    private String fileName;
    private boolean firstColumn;
    private boolean useCustomRecordDelimiter;
    private Charset charset;
    private CsvWriter.UserSettings userSettings;
    private boolean initialized;
    private boolean closed;
    private String systemRecordDelimiter;
    public static final int ESCAPE_MODE_DOUBLED = 1;
    public static final int ESCAPE_MODE_BACKSLASH = 2;

    public CsvWriter(String var1, char var2, Charset var3) {
        this.outputStream = null;
        this.fileName = null;
        this.firstColumn = true;
        this.useCustomRecordDelimiter = false;
        this.charset = null;
        this.userSettings = new CsvWriter.UserSettings();
        this.initialized = false;
        this.closed = false;
        this.systemRecordDelimiter = System.getProperty("line.separator");
        if(var1 == null) {
            throw new IllegalArgumentException("Parameter fileName can not be null.");
        } else if(var3 == null) {
            throw new IllegalArgumentException("Parameter charset can not be null.");
        } else {
            this.fileName = var1;
            this.userSettings.Delimiter = var2;
            this.charset = var3;
        }
    }

    public CsvWriter(String var1) {
        this(var1, ',', Charset.forName("ISO-8859-1"));
    }

    public CsvWriter(Writer var1, char var2) {
        this.outputStream = null;
        this.fileName = null;
        this.firstColumn = true;
        this.useCustomRecordDelimiter = false;
        this.charset = null;
        this.userSettings = new CsvWriter.UserSettings();
        this.initialized = false;
        this.closed = false;
        this.systemRecordDelimiter = System.getProperty("line.separator");
        if(var1 == null) {
            throw new IllegalArgumentException("Parameter outputStream can not be null.");
        } else {
            this.outputStream = var1;
            this.userSettings.Delimiter = var2;
            this.initialized = true;
        }
    }

    public CsvWriter(OutputStream var1, char var2, Charset var3) {
        this(new OutputStreamWriter(var1, var3), var2);
    }

    public char getDelimiter() {
        return this.userSettings.Delimiter;
    }

    public void setDelimiter(char var1) {
        this.userSettings.Delimiter = var1;
    }

    public char getRecordDelimiter() {
        return this.userSettings.RecordDelimiter;
    }

    public void setRecordDelimiter(char var1) {
        this.useCustomRecordDelimiter = true;
        this.userSettings.RecordDelimiter = var1;
    }

    public char getTextQualifier() {
        return this.userSettings.TextQualifier;
    }

    public void setTextQualifier(char var1) {
        this.userSettings.TextQualifier = var1;
    }

    public boolean getUseTextQualifier() {
        return this.userSettings.UseTextQualifier;
    }

    public void setUseTextQualifier(boolean var1) {
        this.userSettings.UseTextQualifier = var1;
    }

    public int getEscapeMode() {
        return this.userSettings.EscapeMode;
    }

    public void setEscapeMode(int var1) {
        this.userSettings.EscapeMode = var1;
    }

    public void setComment(char var1) {
        this.userSettings.Comment = var1;
    }

    public char getComment() {
        return this.userSettings.Comment;
    }

    public boolean getForceQualifier() {
        return this.userSettings.ForceQualifier;
    }

    public void setForceQualifier(boolean var1) {
        this.userSettings.ForceQualifier = var1;
    }

    public void write(String var1, boolean var2) throws IOException {
        this.checkClosed();
        this.checkInit();
        if(var1 == null) {
            var1 = "";
        }

        if(!this.firstColumn) {
            this.outputStream.write(this.userSettings.Delimiter);
        }

        boolean var3 = this.userSettings.ForceQualifier;
        if(!var2 && var1.length() > 0) {
            var1 = var1.trim();
        }

        if(!var3 && this.userSettings.UseTextQualifier && (var1.indexOf(this.userSettings.TextQualifier) > -1 || var1.indexOf(this.userSettings.Delimiter) > -1 || !this.useCustomRecordDelimiter && (var1.indexOf(10) > -1 || var1.indexOf(13) > -1) || this.useCustomRecordDelimiter && var1.indexOf(this.userSettings.RecordDelimiter) > -1 || this.firstColumn && var1.length() > 0 && var1.charAt(0) == this.userSettings.Comment || this.firstColumn && var1.length() == 0)) {
            var3 = true;
        }

        if(this.userSettings.UseTextQualifier && !var3 && var1.length() > 0 && var2) {
            char var4 = var1.charAt(0);
            if(var4 == 32 || var4 == 9) {
                var3 = true;
            }

            if(!var3 && var1.length() > 1) {
                char var5 = var1.charAt(var1.length() - 1);
                if(var5 == 32 || var5 == 9) {
                    var3 = true;
                }
            }
        }

        if(var3) {
            this.outputStream.write(this.userSettings.TextQualifier);
            if(this.userSettings.EscapeMode == 2) {
                var1 = replace(var1, "\\", "\\\\");
                var1 = replace(var1, "" + this.userSettings.TextQualifier, "\\" + this.userSettings.TextQualifier);
            } else {
                var1 = replace(var1, "" + this.userSettings.TextQualifier, "" + this.userSettings.TextQualifier + this.userSettings.TextQualifier);
            }
        } else if(this.userSettings.EscapeMode == 2) {
            var1 = replace(var1, "\\", "\\\\");
            var1 = replace(var1, "" + this.userSettings.Delimiter, "\\" + this.userSettings.Delimiter);
            if(this.useCustomRecordDelimiter) {
                var1 = replace(var1, "" + this.userSettings.RecordDelimiter, "\\" + this.userSettings.RecordDelimiter);
            } else {
                var1 = replace(var1, "\r", "\\\r");
                var1 = replace(var1, "\n", "\\\n");
            }

            if(this.firstColumn && var1.length() > 0 && var1.charAt(0) == this.userSettings.Comment) {
                if(var1.length() > 1) {
                    var1 = "\\" + this.userSettings.Comment + var1.substring(1);
                } else {
                    var1 = "\\" + this.userSettings.Comment;
                }
            }
        }

        this.outputStream.write(var1);
        if(var3) {
            this.outputStream.write(this.userSettings.TextQualifier);
        }

        this.firstColumn = false;
    }

    public void write(String var1) throws IOException {
        this.write(var1, false);
    }

    public void writeComment(String var1) throws IOException {
        this.checkClosed();
        this.checkInit();
        this.outputStream.write(this.userSettings.Comment);
        this.outputStream.write(var1);
        if(this.useCustomRecordDelimiter) {
            this.outputStream.write(this.userSettings.RecordDelimiter);
        } else {
            this.outputStream.write(this.systemRecordDelimiter);
        }

        this.firstColumn = true;
    }

    public void writeRecord(String[] var1, boolean var2) throws IOException {
        if(var1 != null && var1.length > 0) {
            for(int var3 = 0; var3 < var1.length; ++var3) {
                this.write(var1[var3], var2);
            }

            this.endRecord();
        }

    }

    public void writeRecord(String[] var1) throws IOException {
        this.writeRecord(var1, false);
    }

    public void endRecord() throws IOException {
        this.checkClosed();
        this.checkInit();
        if(this.useCustomRecordDelimiter) {
            this.outputStream.write(this.userSettings.RecordDelimiter);
        } else {
            this.outputStream.write(this.systemRecordDelimiter);
        }

        this.firstColumn = true;
    }

    private void checkInit() throws IOException {
        if(!this.initialized) {
            if(this.fileName != null) {
                this.outputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(this.fileName), this.charset));
            }

            this.initialized = true;
        }

    }

    public void flush() throws IOException {
        this.outputStream.flush();
    }

    public void close() {
        if(!this.closed) {
            this.close(true);
            this.closed = true;
        }

    }

    private void close(boolean var1) {
        if(!this.closed) {
            if(var1) {
                this.charset = null;
            }

            try {
                if(this.initialized) {
                    this.outputStream.close();
                }
            } catch (Exception var3) {
                ;
            }

            this.outputStream = null;
            this.closed = true;
        }

    }

    private void checkClosed() throws IOException {
        if(this.closed) {
            throw new IOException("This instance of the CsvWriter class has already been closed.");
        }
    }

    protected void finalize() {
        this.close(false);
    }

    public static String replace(String var0, String var1, String var2) {
        int var3 = var1.length();
        int var4 = var0.indexOf(var1);
        if(var4 <= -1) {
            return var0;
        } else {
            StringBuffer var5 = new StringBuffer();

            int var6;
            for(var6 = 0; var4 != -1; var4 = var0.indexOf(var1, var6)) {
                var5.append(var0.substring(var6, var4));
                var5.append(var2);
                var6 = var4 + var3;
            }

            var5.append(var0.substring(var6));
            return var5.toString();
        }
    }

    private class UserSettings {
        public char TextQualifier = 34;
        public boolean UseTextQualifier = true;
        public char Delimiter = 44;
        public char RecordDelimiter = 0;
        public char Comment = 35;
        public int EscapeMode = 1;
        public boolean ForceQualifier = false;

        public UserSettings() {
        }
    }

    private class Letters {
        public static final char LF = '\n';
        public static final char CR = '\r';
        public static final char QUOTE = '"';
        public static final char COMMA = ',';
        public static final char SPACE = ' ';
        public static final char TAB = '\t';
        public static final char POUND = '#';
        public static final char BACKSLASH = '\\';
        public static final char NULL = '\u0000';

        private Letters() {
        }
    }
} 

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.nio.charset.Charset;
import java.text.NumberFormat;
import java.util.HashMap;

public class CsvReader {
    private Reader inputStream;
    private String fileName;
    private CsvReader.UserSettings userSettings;
    private Charset charset;
    private boolean useCustomRecordDelimiter;
    private CsvReader.DataBuffer dataBuffer;
    private CsvReader.ColumnBuffer columnBuffer;
    private CsvReader.RawRecordBuffer rawBuffer;
    private boolean[] isQualified;
    private String rawRecord;
    private CsvReader.HeadersHolder headersHolder;
    private boolean startedColumn;
    private boolean startedWithQualifier;
    private boolean hasMoreData;
    private char lastLetter;
    private boolean hasReadNextLine;
    private int columnsCount;
    private long currentRecord;
    private String[] values;
    private boolean initialized;
    private boolean closed;
    public static final int ESCAPE_MODE_DOUBLED = 1;
    public static final int ESCAPE_MODE_BACKSLASH = 2;

    public CsvReader(String var1, char var2, Charset var3) throws FileNotFoundException {
        this.inputStream = null;
        this.fileName = null;
        this.userSettings = new CsvReader.UserSettings();
        this.charset = null;
        this.useCustomRecordDelimiter = false;
        this.dataBuffer = new CsvReader.DataBuffer();
        this.columnBuffer = new CsvReader.ColumnBuffer();
        this.rawBuffer = new CsvReader.RawRecordBuffer();
        this.isQualified = null;
        this.rawRecord = "";
        this.headersHolder = new CsvReader.HeadersHolder();
        this.startedColumn = false;
        this.startedWithQualifier = false;
        this.hasMoreData = true;
        this.lastLetter = 0;
        this.hasReadNextLine = false;
        this.columnsCount = 0;
        this.currentRecord = 0L;
        this.values = new String[10];
        this.initialized = false;
        this.closed = false;
        if(var1 == null) {
            throw new IllegalArgumentException("Parameter fileName can not be null.");
        } else if(var3 == null) {
            throw new IllegalArgumentException("Parameter charset can not be null.");
        } else if(!(new File(var1)).exists()) {
            throw new FileNotFoundException("File " + var1 + " does not exist.");
        } else {
            this.fileName = var1;
            this.userSettings.Delimiter = var2;
            this.charset = var3;
            this.isQualified = new boolean[this.values.length];
        }
    }

    public CsvReader(String var1, char var2) throws FileNotFoundException {
        this(var1, var2, Charset.forName("ISO-8859-1"));
    }

    public CsvReader(String var1) throws FileNotFoundException {
        this(var1, ',');
    }

    public CsvReader(Reader var1, char var2) {
        this.inputStream = null;
        this.fileName = null;
        this.userSettings = new CsvReader.UserSettings();
        this.charset = null;
        this.useCustomRecordDelimiter = false;
        this.dataBuffer = new CsvReader.DataBuffer();
        this.columnBuffer = new CsvReader.ColumnBuffer();
        this.rawBuffer = new CsvReader.RawRecordBuffer();
        this.isQualified = null;
        this.rawRecord = "";
        this.headersHolder = new CsvReader.HeadersHolder();
        this.startedColumn = false;
        this.startedWithQualifier = false;
        this.hasMoreData = true;
        this.lastLetter = 0;
        this.hasReadNextLine = false;
        this.columnsCount = 0;
        this.currentRecord = 0L;
        this.values = new String[10];
        this.initialized = false;
        this.closed = false;
        if(var1 == null) {
            throw new IllegalArgumentException("Parameter inputStream can not be null.");
        } else {
            this.inputStream = var1;
            this.userSettings.Delimiter = var2;
            this.initialized = true;
            this.isQualified = new boolean[this.values.length];
        }
    }

    public CsvReader(Reader var1) {
        this(var1, ',');
    }

    public CsvReader(InputStream var1, char var2, Charset var3) {
        this((Reader)(new InputStreamReader(var1, var3)), var2);
    }

    public CsvReader(InputStream var1, Charset var2) {
        this((Reader)(new InputStreamReader(var1, var2)));
    }

    public boolean getCaptureRawRecord() {
        return this.userSettings.CaptureRawRecord;
    }

    public void setCaptureRawRecord(boolean var1) {
        this.userSettings.CaptureRawRecord = var1;
    }

    public String getRawRecord() {
        return this.rawRecord;
    }

    public boolean getTrimWhitespace() {
        return this.userSettings.TrimWhitespace;
    }

    public void setTrimWhitespace(boolean var1) {
        this.userSettings.TrimWhitespace = var1;
    }

    public char getDelimiter() {
        return this.userSettings.Delimiter;
    }

    public void setDelimiter(char var1) {
        this.userSettings.Delimiter = var1;
    }

    public char getRecordDelimiter() {
        return this.userSettings.RecordDelimiter;
    }

    public void setRecordDelimiter(char var1) {
        this.useCustomRecordDelimiter = true;
        this.userSettings.RecordDelimiter = var1;
    }

    public char getTextQualifier() {
        return this.userSettings.TextQualifier;
    }

    public void setTextQualifier(char var1) {
        this.userSettings.TextQualifier = var1;
    }

    public boolean getUseTextQualifier() {
        return this.userSettings.UseTextQualifier;
    }

    public void setUseTextQualifier(boolean var1) {
        this.userSettings.UseTextQualifier = var1;
    }

    public char getComment() {
        return this.userSettings.Comment;
    }

    public void setComment(char var1) {
        this.userSettings.Comment = var1;
    }

    public boolean getUseComments() {
        return this.userSettings.UseComments;
    }

    public void setUseComments(boolean var1) {
        this.userSettings.UseComments = var1;
    }

    public int getEscapeMode() {
        return this.userSettings.EscapeMode;
    }

    public void setEscapeMode(int var1) throws IllegalArgumentException {
        if(var1 != 1 && var1 != 2) {
            throw new IllegalArgumentException("Parameter escapeMode must be a valid value.");
        } else {
            this.userSettings.EscapeMode = var1;
        }
    }

    public boolean getSkipEmptyRecords() {
        return this.userSettings.SkipEmptyRecords;
    }

    public void setSkipEmptyRecords(boolean var1) {
        this.userSettings.SkipEmptyRecords = var1;
    }

    public boolean getSafetySwitch() {
        return this.userSettings.SafetySwitch;
    }

    public void setSafetySwitch(boolean var1) {
        this.userSettings.SafetySwitch = var1;
    }

    public int getColumnCount() {
        return this.columnsCount;
    }

    public long getCurrentRecord() {
        return this.currentRecord - 1L;
    }

    public int getHeaderCount() {
        return this.headersHolder.Length;
    }

    public String[] getHeaders() throws IOException {
        this.checkClosed();
        if(this.headersHolder.Headers == null) {
            return null;
        } else {
            String[] var1 = new String[this.headersHolder.Length];
            System.arraycopy(this.headersHolder.Headers, 0, var1, 0, this.headersHolder.Length);
            return var1;
        }
    }

    public void setHeaders(String[] var1) {
        this.headersHolder.Headers = var1;
        this.headersHolder.IndexByName.clear();
        if(var1 != null) {
            this.headersHolder.Length = var1.length;
        } else {
            this.headersHolder.Length = 0;
        }

        for(int var2 = 0; var2 < this.headersHolder.Length; ++var2) {
            this.headersHolder.IndexByName.put(var1[var2], new Integer(var2));
        }

    }

    public String[] getValues() throws IOException {
        this.checkClosed();
        String[] var1 = new String[this.columnsCount];
        System.arraycopy(this.values, 0, var1, 0, this.columnsCount);
        return var1;
    }

    public String get(int var1) throws IOException {
        this.checkClosed();
        return var1 > -1 && var1 < this.columnsCount?this.values[var1]:"";
    }

    public String get(String var1) throws IOException {
        this.checkClosed();
        return this.get(this.getIndex(var1));
    }

    public static CsvReader parse(String var0) {
        if(var0 == null) {
            throw new IllegalArgumentException("Parameter data can not be null.");
        } else {
            return new CsvReader(new StringReader(var0));
        }
    }

    public boolean readRecord() throws IOException {
        this.checkClosed();
        this.columnsCount = 0;
        this.rawBuffer.Position = 0;
        this.dataBuffer.LineStart = this.dataBuffer.Position;
        this.hasReadNextLine = false;
        if(this.hasMoreData) {
            while(true) {
                if(this.dataBuffer.Position == this.dataBuffer.Count) {
                    this.checkDataLength();
                } else {
                    this.startedWithQualifier = false;
                    char var1 = this.dataBuffer.Buffer[this.dataBuffer.Position];
                    boolean var2;
                    if(this.userSettings.UseTextQualifier && var1 == this.userSettings.TextQualifier) {
                        this.lastLetter = var1;
                        this.startedColumn = true;
                        this.dataBuffer.ColumnStart = this.dataBuffer.Position + 1;
                        this.startedWithQualifier = true;
                        var2 = false;
                        char var10 = this.userSettings.TextQualifier;
                        if(this.userSettings.EscapeMode == 2) {
                            var10 = 92;
                        }

                        boolean var11 = false;
                        boolean var12 = false;
                        boolean var14 = false;
                        byte var13 = 1;
                        int var8 = 0;
                        char var9 = 0;
                        ++this.dataBuffer.Position;

                        do {
                            if(this.dataBuffer.Position == this.dataBuffer.Count) {
                                this.checkDataLength();
                            } else {
                                var1 = this.dataBuffer.Buffer[this.dataBuffer.Position];
                                if(var11) {
                                    this.dataBuffer.ColumnStart = this.dataBuffer.Position + 1;
                                    if(var1 == this.userSettings.Delimiter) {
                                        this.endColumn();
                                    } else if(!this.useCustomRecordDelimiter && (var1 == 13 || var1 == 10) || this.useCustomRecordDelimiter && var1 == this.userSettings.RecordDelimiter) {
                                        this.endColumn();
                                        this.endRecord();
                                    }
                                } else if(var14) {
                                    ++var8;
                                    switch(var13) {
                                        case 1:
                                            var9 = (char)(var9 * 16);
                                            var9 += hexToDec(var1);
                                            if(var8 == 4) {
                                                var14 = false;
                                            }
                                            break;
                                        case 2:
                                            var9 = (char)(var9 * 8);
                                            var9 += (char)(var1 - 48);
                                            if(var8 == 3) {
                                                var14 = false;
                                            }
                                            break;
                                        case 3:
                                            var9 = (char)(var9 * 10);
                                            var9 += (char)(var1 - 48);
                                            if(var8 == 3) {
                                                var14 = false;
                                            }
                                            break;
                                        case 4:
                                            var9 = (char)(var9 * 16);
                                            var9 += hexToDec(var1);
                                            if(var8 == 2) {
                                                var14 = false;
                                            }
                                    }

                                    if(!var14) {
                                        this.appendLetter(var9);
                                    } else {
                                        this.dataBuffer.ColumnStart = this.dataBuffer.Position + 1;
                                    }
                                } else if(var1 == this.userSettings.TextQualifier) {
                                    if(var12) {
                                        var12 = false;
                                        var2 = false;
                                    } else {
                                        this.updateCurrentValue();
                                        if(this.userSettings.EscapeMode == 1) {
                                            var12 = true;
                                        }

                                        var2 = true;
                                    }
                                } else if(this.userSettings.EscapeMode == 2 && var12) {
                                    switch(var1) {
                                        case '0':
                                        case '1':
                                        case '2':
                                        case '3':
                                        case '4':
                                        case '5':
                                        case '6':
                                        case '7':
                                            var13 = 2;
                                            var14 = true;
                                            var8 = 1;
                                            var9 = (char)(var1 - 48);
                                            this.dataBuffer.ColumnStart = this.dataBuffer.Position + 1;
                                        case '8':
                                        case '9':
                                        case ':':
                                        case ';':
                                        case '<':
                                        case '=':
                                        case '>':
                                        case '?':
                                        case '@':
                                        case 'A':
                                        case 'B':
                                        case 'C':
                                        case 'E':
                                        case 'F':
                                        case 'G':
                                        case 'H':
                                        case 'I':
                                        case 'J':
                                        case 'K':
                                        case 'L':
                                        case 'M':
                                        case 'N':
                                        case 'P':
                                        case 'Q':
                                        case 'R':
                                        case 'S':
                                        case 'T':
                                        case 'V':
                                        case 'W':
                                        case 'Y':
                                        case 'Z':
                                        case '[':
                                        case '\\':
                                        case ']':
                                        case '^':
                                        case '_':
                                        case '`':
                                        case 'c':
                                        case 'g':
                                        case 'h':
                                        case 'i':
                                        case 'j':
                                        case 'k':
                                        case 'l':
                                        case 'm':
                                        case 'p':
                                        case 'q':
                                        case 's':
                                        case 'w':
                                        default:
                                            break;
                                        case 'D':
                                        case 'O':
                                        case 'U':
                                        case 'X':
                                        case 'd':
                                        case 'o':
                                        case 'u':
                                        case 'x':
                                            switch(var1) {
                                                case 'D':
                                                case 'd':
                                                    var13 = 3;
                                                    break;
                                                case 'O':
                                                case 'o':
                                                    var13 = 2;
                                                    break;
                                                case 'U':
                                                case 'u':
                                                    var13 = 1;
                                                    break;
                                                case 'X':
                                                case 'x':
                                                    var13 = 4;
                                            }

                                            var14 = true;
                                            var8 = 0;
                                            var9 = 0;
                                            this.dataBuffer.ColumnStart = this.dataBuffer.Position + 1;
                                            break;
                                        case 'a':
                                            this.appendLetter('\u0007');
                                            break;
                                        case 'b':
                                            this.appendLetter('\b');
                                            break;
                                        case 'e':
                                            this.appendLetter('\u001b');
                                            break;
                                        case 'f':
                                            this.appendLetter('\f');
                                            break;
                                        case 'n':
                                            this.appendLetter('\n');
                                            break;
                                        case 'r':
                                            this.appendLetter('\r');
                                            break;
                                        case 't':
                                            this.appendLetter('\t');
                                            break;
                                        case 'v':
                                            this.appendLetter('\u000b');
                                    }

                                    var12 = false;
                                } else if(var1 == var10) {
                                    this.updateCurrentValue();
                                    var12 = true;
                                } else if(var2) {
                                    if(var1 == this.userSettings.Delimiter) {
                                        this.endColumn();
                                    } else if((this.useCustomRecordDelimiter || var1 != 13 && var1 != 10) && (!this.useCustomRecordDelimiter || var1 != this.userSettings.RecordDelimiter)) {
                                        this.dataBuffer.ColumnStart = this.dataBuffer.Position + 1;
                                        var11 = true;
                                    } else {
                                        this.endColumn();
                                        this.endRecord();
                                    }

                                    var2 = false;
                                }

                                this.lastLetter = var1;
                                if(this.startedColumn) {
                                    ++this.dataBuffer.Position;
                                    if(this.userSettings.SafetySwitch && this.dataBuffer.Position - this.dataBuffer.ColumnStart + this.columnBuffer.Position > 100000) {
                                        this.close();
                                        throw new IOException("Maximum column length of 100,000 exceeded in column " + NumberFormat.getIntegerInstance().format((long)this.columnsCount) + " in record " + NumberFormat.getIntegerInstance().format(this.currentRecord) + ". Set the SafetySwitch property to false" + " if you're expecting column lengths greater than 100,000 characters to" + " avoid this error.");
                                    }
                                }
                            }
                        } while(this.hasMoreData && this.startedColumn);
                    } else if(var1 == this.userSettings.Delimiter) {
                        this.lastLetter = var1;
                        this.endColumn();
                    } else if(this.useCustomRecordDelimiter && var1 == this.userSettings.RecordDelimiter) {
                        if(!this.startedColumn && this.columnsCount <= 0 && this.userSettings.SkipEmptyRecords) {
                            this.dataBuffer.LineStart = this.dataBuffer.Position + 1;
                        } else {
                            this.endColumn();
                            this.endRecord();
                        }

                        this.lastLetter = var1;
                    } else if(this.useCustomRecordDelimiter || var1 != 13 && var1 != 10) {
                        if(this.userSettings.UseComments && this.columnsCount == 0 && var1 == this.userSettings.Comment) {
                            this.lastLetter = var1;
                            this.skipLine();
                        } else if(this.userSettings.TrimWhitespace && (var1 == 32 || var1 == 9)) {
                            this.startedColumn = true;
                            this.dataBuffer.ColumnStart = this.dataBuffer.Position + 1;
                        } else {
                            this.startedColumn = true;
                            this.dataBuffer.ColumnStart = this.dataBuffer.Position;
                            var2 = false;
                            boolean var3 = false;
                            byte var4 = 1;
                            int var5 = 0;
                            char var6 = 0;
                            boolean var7 = true;

                            do {
                                if(!var7 && this.dataBuffer.Position == this.dataBuffer.Count) {
                                    this.checkDataLength();
                                } else {
                                    if(!var7) {
                                        var1 = this.dataBuffer.Buffer[this.dataBuffer.Position];
                                    }

                                    if(!this.userSettings.UseTextQualifier && this.userSettings.EscapeMode == 2 && var1 == 92) {
                                        if(var2) {
                                            var2 = false;
                                        } else {
                                            this.updateCurrentValue();
                                            var2 = true;
                                        }
                                    } else if(var3) {
                                        ++var5;
                                        switch(var4) {
                                            case 1:
                                                var6 = (char)(var6 * 16);
                                                var6 += hexToDec(var1);
                                                if(var5 == 4) {
                                                    var3 = false;
                                                }
                                                break;
                                            case 2:
                                                var6 = (char)(var6 * 8);
                                                var6 += (char)(var1 - 48);
                                                if(var5 == 3) {
                                                    var3 = false;
                                                }
                                                break;
                                            case 3:
                                                var6 = (char)(var6 * 10);
                                                var6 += (char)(var1 - 48);
                                                if(var5 == 3) {
                                                    var3 = false;
                                                }
                                                break;
                                            case 4:
                                                var6 = (char)(var6 * 16);
                                                var6 += hexToDec(var1);
                                                if(var5 == 2) {
                                                    var3 = false;
                                                }
                                        }

                                        if(!var3) {
                                            this.appendLetter(var6);
                                        } else {
                                            this.dataBuffer.ColumnStart = this.dataBuffer.Position + 1;
                                        }
                                    } else if(this.userSettings.EscapeMode == 2 && var2) {
                                        switch(var1) {
                                            case '0':
                                            case '1':
                                            case '2':
                                            case '3':
                                            case '4':
                                            case '5':
                                            case '6':
                                            case '7':
                                                var4 = 2;
                                                var3 = true;
                                                var5 = 1;
                                                var6 = (char)(var1 - 48);
                                                this.dataBuffer.ColumnStart = this.dataBuffer.Position + 1;
                                            case '8':
                                            case '9':
                                            case ':':
                                            case ';':
                                            case '<':
                                            case '=':
                                            case '>':
                                            case '?':
                                            case '@':
                                            case 'A':
                                            case 'B':
                                            case 'C':
                                            case 'E':
                                            case 'F':
                                            case 'G':
                                            case 'H':
                                            case 'I':
                                            case 'J':
                                            case 'K':
                                            case 'L':
                                            case 'M':
                                            case 'N':
                                            case 'P':
                                            case 'Q':
                                            case 'R':
                                            case 'S':
                                            case 'T':
                                            case 'V':
                                            case 'W':
                                            case 'Y':
                                            case 'Z':
                                            case '[':
                                            case '\\':
                                            case ']':
                                            case '^':
                                            case '_':
                                            case '`':
                                            case 'c':
                                            case 'g':
                                            case 'h':
                                            case 'i':
                                            case 'j':
                                            case 'k':
                                            case 'l':
                                            case 'm':
                                            case 'p':
                                            case 'q':
                                            case 's':
                                            case 'w':
                                            default:
                                                break;
                                            case 'D':
                                            case 'O':
                                            case 'U':
                                            case 'X':
                                            case 'd':
                                            case 'o':
                                            case 'u':
                                            case 'x':
                                                switch(var1) {
                                                    case 'D':
                                                    case 'd':
                                                        var4 = 3;
                                                        break;
                                                    case 'O':
                                                    case 'o':
                                                        var4 = 2;
                                                        break;
                                                    case 'U':
                                                    case 'u':
                                                        var4 = 1;
                                                        break;
                                                    case 'X':
                                                    case 'x':
                                                        var4 = 4;
                                                }

                                                var3 = true;
                                                var5 = 0;
                                                var6 = 0;
                                                this.dataBuffer.ColumnStart = this.dataBuffer.Position + 1;
                                                break;
                                            case 'a':
                                                this.appendLetter('\u0007');
                                                break;
                                            case 'b':
                                                this.appendLetter('\b');
                                                break;
                                            case 'e':
                                                this.appendLetter('\u001b');
                                                break;
                                            case 'f':
                                                this.appendLetter('\f');
                                                break;
                                            case 'n':
                                                this.appendLetter('\n');
                                                break;
                                            case 'r':
                                                this.appendLetter('\r');
                                                break;
                                            case 't':
                                                this.appendLetter('\t');
                                                break;
                                            case 'v':
                                                this.appendLetter('\u000b');
                                        }

                                        var2 = false;
                                    } else if(var1 == this.userSettings.Delimiter) {
                                        this.endColumn();
                                    } else if(!this.useCustomRecordDelimiter && (var1 == 13 || var1 == 10) || this.useCustomRecordDelimiter && var1 == this.userSettings.RecordDelimiter) {
                                        this.endColumn();
                                        this.endRecord();
                                    }

                                    this.lastLetter = var1;
                                    var7 = false;
                                    if(this.startedColumn) {
                                        ++this.dataBuffer.Position;
                                        if(this.userSettings.SafetySwitch && this.dataBuffer.Position - this.dataBuffer.ColumnStart + this.columnBuffer.Position > 100000) {
                                            this.close();
                                            throw new IOException("Maximum column length of 100,000 exceeded in column " + NumberFormat.getIntegerInstance().format((long)this.columnsCount) + " in record " + NumberFormat.getIntegerInstance().format(this.currentRecord) + ". Set the SafetySwitch property to false" + " if you're expecting column lengths greater than 100,000 characters to" + " avoid this error.");
                                        }
                                    }
                                }
                            } while(this.hasMoreData && this.startedColumn);
                        }
                    } else {
                        if(!this.startedColumn && this.columnsCount <= 0 && (this.userSettings.SkipEmptyRecords || var1 != 13 && this.lastLetter == 13)) {
                            this.dataBuffer.LineStart = this.dataBuffer.Position + 1;
                        } else {
                            this.endColumn();
                            this.endRecord();
                        }

                        this.lastLetter = var1;
                    }

                    if(this.hasMoreData) {
                        ++this.dataBuffer.Position;
                    }
                }

                if(!this.hasMoreData || this.hasReadNextLine) {
                    if(this.startedColumn || this.lastLetter == this.userSettings.Delimiter) {
                        this.endColumn();
                        this.endRecord();
                    }
                    break;
                }
            }
        }

        if(this.userSettings.CaptureRawRecord) {
            if(this.hasMoreData) {
                if(this.rawBuffer.Position == 0) {
                    this.rawRecord = new String(this.dataBuffer.Buffer, this.dataBuffer.LineStart, this.dataBuffer.Position - this.dataBuffer.LineStart - 1);
                } else {
                    this.rawRecord = new String(this.rawBuffer.Buffer, 0, this.rawBuffer.Position) + new String(this.dataBuffer.Buffer, this.dataBuffer.LineStart, this.dataBuffer.Position - this.dataBuffer.LineStart - 1);
                }
            } else {
                this.rawRecord = new String(this.rawBuffer.Buffer, 0, this.rawBuffer.Position);
            }
        } else {
            this.rawRecord = "";
        }

        return this.hasReadNextLine;
    }

    private void checkDataLength() throws IOException {
        if(!this.initialized) {
            if(this.fileName != null) {
                this.inputStream = new BufferedReader(new InputStreamReader(new FileInputStream(this.fileName), this.charset), 4096);
            }

            this.charset = null;
            this.initialized = true;
        }

        this.updateCurrentValue();
        if(this.userSettings.CaptureRawRecord && this.dataBuffer.Count > 0) {
            if(this.rawBuffer.Buffer.length - this.rawBuffer.Position < this.dataBuffer.Count - this.dataBuffer.LineStart) {
                int var1 = this.rawBuffer.Buffer.length + Math.max(this.dataBuffer.Count - this.dataBuffer.LineStart, this.rawBuffer.Buffer.length);
                char[] var2 = new char[var1];
                System.arraycopy(this.rawBuffer.Buffer, 0, var2, 0, this.rawBuffer.Position);
                this.rawBuffer.Buffer = var2;
            }

            System.arraycopy(this.dataBuffer.Buffer, this.dataBuffer.LineStart, this.rawBuffer.Buffer, this.rawBuffer.Position, this.dataBuffer.Count - this.dataBuffer.LineStart);
            this.rawBuffer.Position += this.dataBuffer.Count - this.dataBuffer.LineStart;
        }

        try {
            this.dataBuffer.Count = this.inputStream.read(this.dataBuffer.Buffer, 0, this.dataBuffer.Buffer.length);
        } catch (IOException var3) {
            this.close();
            throw var3;
        }

        if(this.dataBuffer.Count == -1) {
            this.hasMoreData = false;
        }

        this.dataBuffer.Position = 0;
        this.dataBuffer.LineStart = 0;
        this.dataBuffer.ColumnStart = 0;
    }

    public boolean readHeaders() throws IOException {
        boolean var1 = this.readRecord();
        this.headersHolder.Length = this.columnsCount;
        this.headersHolder.Headers = new String[this.columnsCount];

        for(int var2 = 0; var2 < this.headersHolder.Length; ++var2) {
            String var3 = this.get(var2);
            this.headersHolder.Headers[var2] = var3;
            this.headersHolder.IndexByName.put(var3, new Integer(var2));
        }

        if(var1) {
            --this.currentRecord;
        }

        this.columnsCount = 0;
        return var1;
    }

    public String getHeader(int var1) throws IOException {
        this.checkClosed();
        return var1 > -1 && var1 < this.headersHolder.Length?this.headersHolder.Headers[var1]:"";
    }

    public boolean isQualified(int var1) throws IOException {
        this.checkClosed();
        return var1 < this.columnsCount && var1 > -1?this.isQualified[var1]:false;
    }

    private void endColumn() throws IOException {
        String var1 = "";
        int var2;
        if(this.startedColumn) {
            if(this.columnBuffer.Position == 0) {
                if(this.dataBuffer.ColumnStart < this.dataBuffer.Position) {
                    var2 = this.dataBuffer.Position - 1;
                    if(this.userSettings.TrimWhitespace && !this.startedWithQualifier) {
                        while(var2 >= this.dataBuffer.ColumnStart && (this.dataBuffer.Buffer[var2] == 32 || this.dataBuffer.Buffer[var2] == 9)) {
                            --var2;
                        }
                    }

                    var1 = new String(this.dataBuffer.Buffer, this.dataBuffer.ColumnStart, var2 - this.dataBuffer.ColumnStart + 1);
                }
            } else {
                this.updateCurrentValue();
                var2 = this.columnBuffer.Position - 1;
                if(this.userSettings.TrimWhitespace && !this.startedWithQualifier) {
                    while(var2 >= 0 && (this.columnBuffer.Buffer[var2] == 32 || this.columnBuffer.Buffer[var2] == 32)) {
                        --var2;
                    }
                }

                var1 = new String(this.columnBuffer.Buffer, 0, var2 + 1);
            }
        }

        this.columnBuffer.Position = 0;
        this.startedColumn = false;
        if(this.columnsCount >= 100000 && this.userSettings.SafetySwitch) {
            this.close();
            throw new IOException("Maximum column count of 100,000 exceeded in record " + NumberFormat.getIntegerInstance().format(this.currentRecord) + ". Set the SafetySwitch property to false" + " if you're expecting more than 100,000 columns per record to" + " avoid this error.");
        } else {
            if(this.columnsCount == this.values.length) {
                var2 = this.values.length * 2;
                String[] var3 = new String[var2];
                System.arraycopy(this.values, 0, var3, 0, this.values.length);
                this.values = var3;
                boolean[] var4 = new boolean[var2];
                System.arraycopy(this.isQualified, 0, var4, 0, this.isQualified.length);
                this.isQualified = var4;
            }

            this.values[this.columnsCount] = var1;
            this.isQualified[this.columnsCount] = this.startedWithQualifier;
            var1 = "";
            ++this.columnsCount;
        }
    }

    private void appendLetter(char var1) {
        if(this.columnBuffer.Position == this.columnBuffer.Buffer.length) {
            int var2 = this.columnBuffer.Buffer.length * 2;
            char[] var3 = new char[var2];
            System.arraycopy(this.columnBuffer.Buffer, 0, var3, 0, this.columnBuffer.Position);
            this.columnBuffer.Buffer = var3;
        }

        this.columnBuffer.Buffer[this.columnBuffer.Position++] = var1;
        this.dataBuffer.ColumnStart = this.dataBuffer.Position + 1;
    }

    private void updateCurrentValue() {
        if(this.startedColumn && this.dataBuffer.ColumnStart < this.dataBuffer.Position) {
            if(this.columnBuffer.Buffer.length - this.columnBuffer.Position < this.dataBuffer.Position - this.dataBuffer.ColumnStart) {
                int var1 = this.columnBuffer.Buffer.length + Math.max(this.dataBuffer.Position - this.dataBuffer.ColumnStart, this.columnBuffer.Buffer.length);
                char[] var2 = new char[var1];
                System.arraycopy(this.columnBuffer.Buffer, 0, var2, 0, this.columnBuffer.Position);
                this.columnBuffer.Buffer = var2;
            }

            System.arraycopy(this.dataBuffer.Buffer, this.dataBuffer.ColumnStart, this.columnBuffer.Buffer, this.columnBuffer.Position, this.dataBuffer.Position - this.dataBuffer.ColumnStart);
            this.columnBuffer.Position += this.dataBuffer.Position - this.dataBuffer.ColumnStart;
        }

        this.dataBuffer.ColumnStart = this.dataBuffer.Position + 1;
    }

    private void endRecord() throws IOException {
        this.hasReadNextLine = true;
        ++this.currentRecord;
    }

    public int getIndex(String var1) throws IOException {
        this.checkClosed();
        Object var2 = this.headersHolder.IndexByName.get(var1);
        return var2 != null?((Integer)var2).intValue():-1;
    }

    public boolean skipRecord() throws IOException {
        this.checkClosed();
        boolean var1 = false;
        if(this.hasMoreData) {
            var1 = this.readRecord();
            if(var1) {
                --this.currentRecord;
            }
        }

        return var1;
    }

    public boolean skipLine() throws IOException {
        this.checkClosed();
        this.columnsCount = 0;
        boolean var1 = false;
        if(this.hasMoreData) {
            boolean var2 = false;

            do {
                if(this.dataBuffer.Position == this.dataBuffer.Count) {
                    this.checkDataLength();
                } else {
                    var1 = true;
                    char var3 = this.dataBuffer.Buffer[this.dataBuffer.Position];
                    if(var3 == 13 || var3 == 10) {
                        var2 = true;
                    }

                    this.lastLetter = var3;
                    if(!var2) {
                        ++this.dataBuffer.Position;
                    }
                }
            } while(this.hasMoreData && !var2);

            this.columnBuffer.Position = 0;
            this.dataBuffer.LineStart = this.dataBuffer.Position + 1;
        }

        this.rawBuffer.Position = 0;
        this.rawRecord = "";
        return var1;
    }

    public void close() {
        if(!this.closed) {
            this.close(true);
            this.closed = true;
        }

    }

    private void close(boolean var1) {
        if(!this.closed) {
            if(var1) {
                this.charset = null;
                this.headersHolder.Headers = null;
                this.headersHolder.IndexByName = null;
                this.dataBuffer.Buffer = null;
                this.columnBuffer.Buffer = null;
                this.rawBuffer.Buffer = null;
            }

            try {
                if(this.initialized) {
                    this.inputStream.close();
                }
            } catch (Exception var3) {
                ;
            }

            this.inputStream = null;
            this.closed = true;
        }

    }

    private void checkClosed() throws IOException {
        if(this.closed) {
            throw new IOException("This instance of the CsvReader class has already been closed.");
        }
    }

    protected void finalize() {
        this.close(false);
    }

    private static char hexToDec(char var0) {
        char var1;
        if(var0 >= 97) {
            var1 = (char)(var0 - 97 + 10);
        } else if(var0 >= 65) {
            var1 = (char)(var0 - 65 + 10);
        } else {
            var1 = (char)(var0 - 48);
        }

        return var1;
    }

    private class StaticSettings {
        public static final int MAX_BUFFER_SIZE = 1024;
        public static final int MAX_FILE_BUFFER_SIZE = 4096;
        public static final int INITIAL_COLUMN_COUNT = 10;
        public static final int INITIAL_COLUMN_BUFFER_SIZE = 50;

        private StaticSettings() {
        }
    }

    private class HeadersHolder {
        public String[] Headers = null;
        public int Length = 0;
        public HashMap IndexByName = new HashMap();

        public HeadersHolder() {
        }
    }

    private class UserSettings {
        public boolean CaseSensitive = true;
        public char TextQualifier = 34;
        public boolean TrimWhitespace = true;
        public boolean UseTextQualifier = true;
        public char Delimiter = 44;
        public char RecordDelimiter = 0;
        public char Comment = 35;
        public boolean UseComments = false;
        public int EscapeMode = 1;
        public boolean SafetySwitch = true;
        public boolean SkipEmptyRecords = true;
        public boolean CaptureRawRecord = true;

        public UserSettings() {
        }
    }

    private class Letters {
        public static final char LF = '\n';
        public static final char CR = '\r';
        public static final char QUOTE = '"';
        public static final char COMMA = ',';
        public static final char SPACE = ' ';
        public static final char TAB = '\t';
        public static final char POUND = '#';
        public static final char BACKSLASH = '\\';
        public static final char NULL = '\u0000';
        public static final char BACKSPACE = '\b';
        public static final char FORM_FEED = '\f';
        public static final char ESCAPE = '\u001b';
        public static final char VERTICAL_TAB = '\u000b';
        public static final char ALERT = '\u0007';

        private Letters() {
        }
    }

    private class RawRecordBuffer {
        public char[] Buffer = new char[500];
        public int Position = 0;

        public RawRecordBuffer() {
        }
    }

    private class ColumnBuffer {
        public char[] Buffer = new char[50];
        public int Position = 0;

        public ColumnBuffer() {
        }
    }

    private class DataBuffer {
        public char[] Buffer = new char[1024];
        public int Position = 0;
        public int Count = 0;
        public int ColumnStart = 0;
        public int LineStart = 0;

        public DataBuffer() {
        }
    }

    private class ComplexEscape {
        private static final int UNICODE = 1;
        private static final int OCTAL = 2;
        private static final int DECIMAL = 3;
        private static final int HEX = 4;

        private ComplexEscape() {
        }
    }
} 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章