?? csv.java
字號:
private void pushBack(int ch) {
back = ch;
}
private int readChar() throws IOException {
int ch = back;
if (ch != -1) {
back = -1;
return ch;
} else if (endOfFile) {
return -1;
}
ch = reader.read();
if (ch < 0) {
endOfFile = true;
close();
}
return ch;
}
private String readValue() throws IOException {
endOfLine = false;
String value = null;
outer:
while (true) {
int ch = readChar();
if (ch < 0 || ch == '\r' || ch == '\n') {
endOfLine = true;
break;
} else if (ch <= ' ') {
// ignore spaces
continue;
} else if (ch == fieldSeparatorRead) {
// null
break;
} else if (ch == fieldDelimiter) {
// delimited value
StringBuffer buff = new StringBuffer();
boolean containsEscape = false;
while (true) {
ch = readChar();
if (ch < 0) {
value = buff.toString();
break outer;
} else if (ch == fieldDelimiter) {
ch = readChar();
if (ch == fieldDelimiter) {
buff.append((char) ch);
} else {
pushBack(ch);
break;
}
} else if (ch == escapeCharacter) {
buff.append((char) ch);
ch = readChar();
if (ch < 0) {
break;
}
containsEscape = true;
buff.append((char) ch);
} else {
buff.append((char) ch);
}
}
value = buff.toString();
if (containsEscape) {
value = unEscape(value);
}
while (true) {
ch = readChar();
if (ch < 0) {
break;
} else if (ch == ' ' || ch == '\t') {
// ignore
} else if (ch == fieldSeparatorRead) {
break;
} else if (ch == '\r' || ch == '\n') {
pushBack(ch);
endOfLine = true;
break;
} else {
pushBack(ch);
break;
}
}
break;
} else if (ch == commentLineStart) {
// comment until end of line
while (true) {
ch = readChar();
if (ch < 0 || ch == '\r' || ch == '\n') {
break;
}
}
endOfLine = true;
break;
} else {
// un-delimited value
StringBuffer buff = new StringBuffer();
buff.append((char) ch);
while (true) {
ch = readChar();
if (ch == fieldSeparatorRead) {
break;
} else if (ch == '\r' || ch == '\n') {
pushBack(ch);
endOfLine = true;
break;
} else if (ch < 0) {
break;
}
buff.append((char) ch);
}
// check un-delimited value for nullString
value = readNull(buff.toString().trim());
break;
}
}
// save memory
return StringCache.get(value);
}
private String readNull(String s) {
return s.equals(nullString) ? null : s;
}
private String unEscape(String s) {
StringBuffer buff = new StringBuffer(s.length());
int start = 0;
char[] chars = null;
while (true) {
int idx = s.indexOf(escapeCharacter, start);
if (idx < 0) {
break;
}
if (chars == null) {
chars = s.toCharArray();
}
buff.append(chars, start, idx - start);
if (idx == s.length() - 1) {
start = s.length();
break;
}
buff.append(chars[idx + 1]);
start = idx + 2;
}
buff.append(s.substring(start));
return buff.toString();
}
/**
* INTERNAL
*/
public Object[] readRow() throws SQLException {
if (reader == null) {
return null;
}
String[] row = new String[columnNames.length];
try {
for (int i = 0;; i++) {
String v = readValue();
if (v == null) {
if (endOfFile && i == 0) {
return null;
}
if (endOfLine) {
if (i == 0) {
// empty line
i--;
continue;
}
break;
}
}
if (i < row.length) {
row[i] = v;
}
}
} catch (IOException e) {
throw convertException("IOException reading from " + fileName, e);
}
return row;
}
private SQLException convertException(String message, Exception e) {
SQLException s = new SQLException(message, "CSV");
//#ifdef JDK14
s.initCause(e);
//#endif
return s;
}
/**
* INTERNAL
*/
public void close() {
IOUtils.closeSilently(reader);
reader = null;
IOUtils.closeSilently(writer);
writer = null;
}
/**
* INTERNAL
*/
public void reset() throws SQLException {
throw new SQLException("Method is not supported", "CSV");
}
/**
* Override the field separator for writing. The default is ",".
*
* @param fieldSeparatorWrite the field separator
*/
public void setFieldSeparatorWrite(String fieldSeparatorWrite) {
this.fieldSeparatorWrite = fieldSeparatorWrite;
}
/**
* Get the current field separator for writing.
*
* @return the field separator
*/
public String getFieldSeparatorWrite() {
return fieldSeparatorWrite;
}
/**
* Override the field separator for reading. The default is ','.
*
* @param fieldSeparatorRead the field separator
*/
public void setFieldSeparatorRead(char fieldSeparatorRead) {
this.fieldSeparatorRead = fieldSeparatorRead;
}
/**
* Get the current field separator for reading.
*
* @return the field separator
*/
public char getFieldSeparatorRead() {
return fieldSeparatorRead;
}
/**
* Get the current row separator for writing.
*
* @return the row separator
*/
public String getRowSeparatorWrite() {
return rowSeparatorWrite;
}
/**
* Override the end-of-row marker for writing. The default is null. After
* writing the end-of-row marker, a line feed is written (\n or \r\n
* depending on the system settings).
*
* @param rowSeparatorWrite the row separator
*/
public void setRowSeparatorWrite(String rowSeparatorWrite) {
this.rowSeparatorWrite = rowSeparatorWrite;
}
/**
* Set the field delimiter. The default is " (a double quote).
* 0 means no field delimiter is used.
*
* @param fieldDelimiter the field delimiter
*/
public void setFieldDelimiter(char fieldDelimiter) {
this.fieldDelimiter = fieldDelimiter;
}
/**
* Get the current field delimiter.
* 0 means no field delimiter is used.
*
* @return the field delimiter
*/
public char getFieldDelimiter() {
return fieldDelimiter;
}
/**
* Set the escape character (used to escape the field delimiter). The
* default is " (a double quote). 0 means no escape character is used.
*
* @param escapeCharacter the escape character
*/
public void setEscapeCharacter(char escapeCharacter) {
this.escapeCharacter = escapeCharacter;
}
/**
* Get the current escape character.
* 0 means no escape character is used.
*
* @return the escape character
*/
public char getEscapeCharacter() {
return escapeCharacter;
}
/**
* Set the line separator.
*
* @param lineSeparator the line separator
*/
public void setLineSeparator(String lineSeparator) {
this.lineSeparator = lineSeparator;
}
/**
* Set the value that represents NULL.
*
* @param nullString the null
*/
public void setNullString(String nullString) {
this.nullString = nullString;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -