CSV写入异常排查:对比表头数组后仅写入空串,求解决思路
CSV文件仅写入空串的问题排查
核心问题总结
你的代码存在三个关键错误,直接导致CSV只写入空串:
1. sameHeaders函数逻辑完全错误
该函数不仅有语法问题,逻辑也完全背离需求:
- 参数大小写不匹配:方法参数定义的是
String[] A和String[] b,但方法内用的是a.length和a[i],会直接触发编译失败。 - 逻辑颠倒且错误:当前逻辑是只要找到一个位置的元素相等,就立刻返回true,既不是判断两个数组对应元素是否全部相等,也无法支持"逐列判断是否写空"的需求。
错误代码:
private boolean sameHeaders(String[] A, String[] b) { for(int i = 0; i <= a.length - 1; i++) { if(a[i].equals(b[i])) return true; // 只要有一个元素相等就返回true,完全错误 } return false; // 缺少分号 }
2. writeCsvData方法的逻辑与语法错误
当前逻辑是判断整个表头数组是否"相同",如果认为相同就全写空,否则全写业务数据,这和你"逐列判断、对应列相同则写空"的需求完全不符。同时方法内还有多处语法错误:
Buffered write应为BufferedWriter writerFilterWrite应为FileWriterwriter.write("")末尾缺少分号catch (exception e)应为catch (Exception e)
错误逻辑代码片段:
// 错误:判断整个数组是否"相同",而非逐列处理 if(!sameHeaders(MY_HEADERS, EMPTY_COLUMNS)) { writer.write(getReportData(report)); } else { writer.write(""); // 缺少分号 }
3. 正确的实现思路
要实现需求,你需要逐列对比两个数组的对应元素,而非整体判断:
- 先确保
MY_HEADERS和EMPTY_COLUMNS长度一致,避免数组越界 - 遍历每一列,对应位置元素相同则写空串,否则写入该列的业务数据
- 将每行的列数据用CSV分隔符拼接后写入文件
示例修正后的核心逻辑:
private void writeCsvData(File csv, List<MyReport> reports) { try (BufferedWriter writer = new BufferedWriter(new FileWriter(csv))) { writer.write(getReportHeader()); writer.newLine(); // 前置校验:确保两个表头数组长度一致 if (MY_HEADERS.length != EMPTY_COLUMNS.length) { // 处理长度不匹配的异常场景 return; } for(MyReport report : reports) { StringBuilder row = new StringBuilder(); // 逐列处理每一行数据 for (int i = 0; i < MY_HEADERS.length; i++) { if (MY_HEADERS[i].equals(EMPTY_COLUMNS[i])) { row.append(""); // 对应列写入空串 } else { // 替换为你实际获取该列业务数据的逻辑 row.append(getColumnData(report, i)); } // 添加CSV分隔符,最后一列跳过 if (i != MY_HEADERS.length - 1) { row.append(","); } } writer.write(row.toString()); writer.newLine(); } writer.flush(); } catch (Exception e) { // 异常日志记录 e.printStackTrace(); } }
内容的提问来源于stack exchange,提问作者Aindriu
相关产品推荐
相关产品推荐

