csv文件类似下面的,该怎么读?
aaa,bbbb,cccc,dddd,eeee
aass,ssss,"dddd,aaaa,ssss","dddd,aaa,dd"
aaa,"sss,ssss,ssssss",ssssss,ddddd,gggg
aaa,bbbb,cccc,dddd,eeee
aass,ssss,"dddd,aaaa,ssss","dddd,aaa,dd"
aaa,"sss,ssss,ssssss",ssssss,ddddd,gggg
* 读取CSV文件中的数据
*
* @param filePath :
* 文件完整路径名
* @return List<Map<String, String>>
* ArrayList的一个元素是文件的一行,LinkedHashMap的key是该单元格数据对应的字段名,value是单元格数据
* @throws IOException 读写异常
*/
public List<Map<String, String>> readFileData(String filePath)
throws IOException
{
// 记录日志
try
{
File file = new File(filePath);
if (!file.exists())
{
return null;
}
}
catch (Exception e)
{
return null;
}
List<Map<String, String>> arrayList = new ArrayList<Map<String, String>>();
//使用gb2312方式读取导入的主机文件,否则在linux上中文会出现乱码
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(filePath), "GB2312"));
try
{
//字段名称列表,读取字段名称列表
List<String> fieldNameList = getFieldNameList(reader);
if (fieldNameList != null && !fieldNameList.isEmpty())
{
// 取得单元格值数据
arrayList = getValueList(reader, fieldNameList);
}
// 字段名行值为空,登记位置
else
{
}
}
catch (IOException e)
{
throw e;
}
finally
{
// 关闭流
if (reader != null)
{
reader.close();
}
}
return arrayList;
}
* 取得字段名数组
*
* @param reader :
* 单行数据
* @return String
* 特殊字符所在单元格完成的数据(去除了前后的")
* @throws IOException
*/
List<String> getFieldNameList(BufferedReader reader)
throws IOException
{
// 记录日志
List<String> fieldNameList = new ArrayList<String>();
String tmp = "";
String tmpBak = "";
while ((tmp = reader.readLine()) != null)
{
// 如果上一行数据不是完整的一行,则将改行和上一行数据合并
if (!"".equals(tmpBak))
{
StringBuffer strBuffer = new StringBuffer();
strBuffer.append(tmpBak);
strBuffer.append("\r\n");
strBuffer.append(tmp);
tmp = strBuffer.toString();
tmpBak = "";
}
String splitTmp = "#" + tmp + "#";
String[] list = splitTmp.split(",");
//去除前后的"#"
list = delSpecialChar(list);
// 如果文件中的改行不是完整的行,则跳到下一行处理
if (!isPerfectRow(tmp))
{
tmpBak = tmp;
continue;
}
else
{
for (int k = 0; k < list.length; k++)
{
// 完整的单元格数据
String perfectStr = "";
//如果存在特殊字符
if (list[k].indexOf("\"") >= 0)
{
perfectStr = getValue(list, k, true);
k = k + sepcialCharDepth;
sepcialCharDepth = 0;
}
else
{
perfectStr = list[k];
}
// 如果处理后的单元格数据有",则需要去掉多余的"
if (perfectStr.indexOf("\"") >= 0)
{
perfectStr = delExtraChar(perfectStr);
}
fieldNameList.add(perfectStr);
}
break;
}
}
return fieldNameList;
}
* 取得单元格值数据
*
* @param reader :
* 单行数据
* @param fieldNameList :
* 字段名称列表
* @return List<LinkedHashMap<String, String>>
* 单元格值数据
* @throws IOException
*/
private List<Map<String, String>> getValueList(BufferedReader reader,
List<String> fieldNameList) throws IOException
{
List<Map<String, String>> arrayList = new ArrayList<Map<String, String>>();
// 获取完整的处理是否执行中的标识(true:执行中)
boolean executingFlag = false;
String tmp = "";
String tmpBak = "";
while ((tmp = reader.readLine()) != null)
{
// 如果上一行数据不是完整的一行,则将改行和上一行数据合并
if (executingFlag)
{
StringBuffer strBuffer = new StringBuffer();
if (isPerfectRowEnd(tmp))
{
executingFlag = false;
strBuffer.append(tmpBak);
strBuffer.append("\r\n");
strBuffer.append(tmp);
tmp = strBuffer.toString();
tmpBak = "";
}
else
{
strBuffer.append(tmpBak);
strBuffer.append("\r\n");
strBuffer.append(tmp);
tmpBak = strBuffer.toString();
continue;
}
}
LinkedHashMap<String, String> rowMap = new LinkedHashMap<String, String>();
String splitTmp = "#" + tmp + "#";
String[] list = splitTmp.split(",");
//去除前后的"#"
list = delSpecialChar(list);
// 如果文件中的改行不是完整的行,则跳到下一行处理
if (!isPerfectRow(tmp))
{
executingFlag = true;
tmpBak = tmp;
continue;
}
int cellIndex = 0;
for (int k = 0; k < list.length; k++)
{
// 如果单元格所在的列数超过了字段名数据的总列数,则退出循环
if (cellIndex >= fieldNameList.size())
{
break;
}
// 完整的单元格数据
String perfectStr = "";
//如果存在特殊字符
if (list[k].indexOf("\"") >= 0)
{
perfectStr = getValue(list, k, true);
k = k + sepcialCharDepth;
sepcialCharDepth = 0;
}
else
{
perfectStr = list[k];
}
// 如果处理后的单元格数据有",则需要去掉多余的"
if (perfectStr.indexOf("\"") >= 0)
{
perfectStr = delExtraChar(perfectStr);
}
rowMap.put(fieldNameList.get(cellIndex), perfectStr);
cellIndex++;
}
arrayList.add(rowMap);
}
return arrayList;
}