Processing 3读取CSV文件异常求助:无法识别"Nil"值
解决Processing 3读取CSV时无法检测到"Nil"字符串的问题
嘿,我看到你在用Processing 3读取titanicLinearisedDataSet.csv时遇到了头疼的问题——明明文件里存在"Nil"值,但代码就是检测不到。结合你给出的代码片段和CSV截图,我来帮你梳理几个最可能的原因和对应的解决办法:
1. 手动分割字符串时的细节遗漏
从你贴的代码来看,你是用loadStrings()把文件拆成每行,再手动分割成二维数组。这种方式很容易踩CSV的各种小坑:
- "Nil"前后有隐藏空白:比如CSV里的"Nil"可能带了空格、制表符,或者每行末尾有残留的换行符,导致你拿到的字符串是
" Nil"或者"Nil\n",直接用equals("Nil")自然匹配不上。 - 被引号包裹的"Nil":如果你的CSV里"Nil"是用双引号括起来的(比如
"Nil"),分割后字符串会带着引号,这时候判断肯定失败。
修正后的手动分割代码
String[][] array; void setup() { String[] lines = loadStrings("titanicLinearisedDataSet.csv"); array = new String[lines.length][3]; for (int i = 0; i < lines.length; i++) { // 先去掉每行前后的所有空白字符(包括换行、空格、制表符) String cleanedLine = lines[i].trim(); // 按逗号分割成列(如果你的CSV用的是其他分隔符,比如分号,就改成";") String[] cols = cleanedLine.split(","); // 遍历每一列,去掉可能的双引号,再清理一次空白 for (int j = 0; j < cols.length; j++) { array[i][j] = cols[j].replace("\"", "").trim(); } // 现在再检测"Nil",比如检测第二列(索引1) if (array[i][1].equals("Nil")) { println("找到Nil值,在第" + (i+1) + "行"); } } }
2. 优先用Processing自带的Table类读取CSV
手动处理CSV分割真的很容易出错,Processing专门提供了Table类来处理这类文件,它会自动处理引号、分隔符、空白等细节,代码更简洁也更稳定:
Table titanicData; void setup() { // 加载CSV,如果你的文件有表头,就加上"header"参数,没有就去掉 titanicData = loadTable("titanicLinearisedDataSet.csv", "header"); // 遍历每一行数据 for (TableRow row : titanicData.rows()) { // 获取指定列的值,这里替换成你要检测的列名(比如"Age") String targetValue = row.getString("Age"); // 检测前先清理空白,再判断 if (targetValue.trim().equals("Nil")) { println("找到Nil值,行号:" + (row.getIndex() + 1)); } } }
3. 检查CSV文件的编码问题
你是用TextEdit创建的CSV,有可能保存时用了非UTF-8的编码(比如UTF-16或者Mac罗马编码),导致Processing读取时字符乱码,"Nil"变成了看不见的异常字符,自然匹配失败。
解决办法:
打开你的CSV文件,在TextEdit里:
- 点击顶部菜单「格式」→「转换为纯文本」
- 然后「文件」→「存储」,在存储弹窗的选项里,把编码改成UTF-8,再保存。
先试试用Table类的方案,这应该能解决大部分CSV读取的问题,如果还是不行,再检查编码和手动分割的细节~
内容的提问来源于stack exchange,提问作者user7345213
相关产品推荐
相关产品推荐

