<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
import
java.io.BufferedReader;
import
java.io.BufferedWriter;
import
java.io.File;
import
java.io.FileNotFoundException;
import
java.io.FileReader;
import
java.io.FileWriter;
import
java.io.IOException;
import
java.util.ArrayList;
import
java.util.List;
import
java.util.logging.Level;
import
java.util.logging.Logger;
import
java.util.regex.Matcher;
import
java.util.regex.Pattern;
/**
*
@author
panhf2003
*
@version
2008/09/05,
*/
public
class
CsvFileUtil
{
/**
* 构造,禁止实例化
*/
private
CsvFileUtil()
{}
public
static
void
main(String[] args)
{
try
{
readCsvFile(
"
d:\\ZD_CUSTOMER_VIEW.csv
"
);
}
catch
(FileNotFoundException ex)
{
Logger.getLogger(CsvFileUtil.
class
.getName()).log(Level.SEVERE,
null
, ex);
}
catch
(IOException ex)
{
Logger.getLogger(CsvFileUtil.
class
.getName()).log(Level.SEVERE,
null
, ex);
}
}
/**
* csv文件读取<BR/> 读取绝对路径为argPath的csv文件数据,并以List返回。
*
*
@param
argPath
* csv文件绝对路径
*
@return
csv文件数据(List<String[]>)
*
@throws
FileNotFoundException
*
@throws
IOException
*/
public
static
List
<
String[]
>
readCsvFile(String argPath)
throws
FileNotFoundException, IOException
{
CsvFileUtil util
=
new
CsvFileUtil();
File cvsFile
=
new
File(argPath);
List
<
String[]
>
list
=
new
ArrayList
<
String[]
>
();
FileReader fileReader
=
null
;
BufferedReader bufferedReader
=
null
;
try
{
fileReader
=
new
FileReader(cvsFile);
bufferedReader
=
new
BufferedReader(fileReader);
String regExp
=
util.getRegExp();
String strLine
=
""
;
String str
=
""
;
while
((strLine
=
bufferedReader.readLine())
!=
null
)
{
Pattern pattern
=
Pattern.compile(regExp);
Matcher matcher
=
pattern.matcher(strLine);
List
<
String
>
listTemp
=
new
ArrayList
<
String
>
();
while
(matcher.find())
{
str
=
matcher.group();
str
=
str.trim();
if
(str.endsWith(
"
,
"
))
{
str
=
str.substring(
0
, str.length()
-
1
);
str
=
str.trim();
}
if
(str.startsWith(
"
\
""
) && str.endsWith(
"
\
""
))
{
str
=
str.substring(
1
, str.length()
-
1
);
if
(util.isExisted(
"
\
"
\
""
, str))
{
str
=
str.replaceAll(
"
\
"
\
""
,
"
\
""
);
}
}
if
(
!
""
.equals(str))
{
System.out.print(str
+
"
"
);
listTemp.add(str);
}
}
//
test
System.out.println();
list.add((String[]) listTemp
.toArray(
new
String[listTemp.size()]));
}
}
catch
(FileNotFoundException e)
{
throw
e;
}
catch
(IOException e)
{
throw
e;
}
finally
{
try
{
if
(bufferedReader
!=
null
)
{
bufferedReader.close();
}
if
(fileReader
!=
null
)
{
fileReader.close();
}
}
catch
(IOException e)
{
throw
e;
}
}
return
list;
}
/**
* csv文件做成<BR/> 将argList写入argPath路径下的argFileName文件里。
*
*
@param
argList
* 要写入csv文件的数据(List<String[]>)
*
@param
argPath
* csv文件路径
*
@param
argFileName
* csv文件名
*
@param
isNewFile
* 是否覆盖原有文件
*
@throws
IOException
*
@throws
Exception
*/
public
static
void
writeCsvFile(List
<
String[]
>
argList, String argPath,
String argFileName,
boolean
isNewFile)
throws
IOException,
Exception
{
CsvFileUtil util
=
new
CsvFileUtil();
//
数据check
if
(argList
==
null
||
argList.size()
==
0
)
{
throw
new
Exception(
"
没有数据
"
);
}
for
(
int
i
=
0
; i
<
argList.size(); i
++
)
{
if
(
!
(argList.get(i)
instanceof
String[]))
{
throw
new
Exception(
"
数据格式不对
"
);
}
}
FileWriter fileWriter
=
null
;
BufferedWriter bufferedWriter
=
null
;
String strFullFileName
=
argPath;
if
(strFullFileName.lastIndexOf(
"
\\
"
)
==
(strFullFileName.length()
-
1
))
{
strFullFileName
+=
argFileName;
}
else
{
strFullFileName
+=
"
\\
"
+
argFileName;
}
File file
=
new
File(strFullFileName);
//
文件路径check
if
(
!
file.getParentFile().exists())
{
file.getParentFile().mkdirs();
}
try
{
if
(isNewFile)
{
//
覆盖原有文件
fileWriter
=
new
FileWriter(file);
}
else
{
//
在原有文件上追加数据
fileWriter
=
new
FileWriter(file,
true
);
}
bufferedWriter
=
new
BufferedWriter(fileWriter);
for
(
int
i
=
0
; i
<
argList.size(); i
++
)
{
String[] strTemp
=
(String[]) argList.get(i);
for
(
int
j
=
0
; j
<
strTemp.length; j
++
)
{
if
(util.isExisted(
"
\
""
, strTemp[j]))
{
strTemp[j]
=
strTemp[j].replaceAll(
"
\
""
,
"
\
"
\
""
);
bufferedWriter.write(
"
\
""
+ strTemp[j] +
"
\
""
);
}
else
if
(util.isExisted(
"
,
"
, strTemp[j])
||
util.isExisted(
"
\n
"
, strTemp[j])
||
util.isExisted(
"
"
, strTemp[j])
||
util.isExisted(
"
??
"
, strTemp[j]))
{
bufferedWriter.write(
"
\
""
+ strTemp[j] +
"
\
""
);
}
else
{
bufferedWriter.write(strTemp[j]);
}
if
(j
<
strTemp.length
-
1
)
{
bufferedWriter.write(
"
,
"
);
}
}
bufferedWriter.newLine();
}
}
catch
(IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if
(bufferedWriter
!=
null
)
{
bufferedWriter.close();
}
if
(fileWriter
!=
null
)
{
fileWriter.close();
}
}
catch
(IOException e)
{
throw
e;
}
}
}
/**
*
@param
argChar
*
@param
argStr
*
@return
*/
private
boolean
isExisted(String argChar, String argStr)
{
boolean
blnReturnValue
=
false
;
if
((argStr.indexOf(argChar)
>=
0
)
&&
(argStr.indexOf(argChar)
<=
argStr.length()))
{
blnReturnValue
=
true
;
}
return
blnReturnValue;
}
/**
* 正则表达式。
*
*
@return
匹配csv文件里最小单位的正则表达式。
*/
private
String getRegExp()
{
StringBuffer strRegExps
=
new
StringBuffer();
strRegExps.append(
"
\
"
((
"
);
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append(
"
*[,\\n ])*(
"
);
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append(
"
*\
"
{
2
})
*
)
*
"
);
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append(
"
*\
"
[ ]
*
,[ ]
*
"
);
strRegExps.append(
"
|
"
);
strRegExps.append(SPECIAL_CHAR_B);
strRegExps.append(
"
*[ ]*,[ ]*
"
);
strRegExps.append(
"
|\
"
((
"
);
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append(
"
*[,\\n ])*(
"
);
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append(
"
*\
"
{
2
})
*
)
*
"
);
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append(
"
*\
"
[ ]
*
"
);
strRegExps.append(
"
|
"
);
strRegExps.append(SPECIAL_CHAR_B);
strRegExps.append(
"
*[ ]*
"
);
return
strRegExps.toString();
}
private
static
final
String SPECIAL_CHAR_A
=
"
[^\
"
,\\n ]
"
;
private
static
final
String SPECIAL_CHAR_B
=
"
[^\
"
,\\n]
"
;
}