Java双条件逻辑判断异常问题:Scanner读取CSV文件时输出为空求助
问题分析与解决
首先,咱们先揪出核心的逻辑问题——这正是输出为空的关键原因!
你的预期是仅过滤掉item等于args[1]且property1等于args[2]的行(比如示例中的最后一行pencil,YY,12),其余行都保留写入文件。但你当前写的条件:
if(!item.equals(args[1]) && !property1.equals(args[2]))
这个条件的实际含义是:只有当item不等于args[1],并且property1不等于args[2]的时候,才会写入该行。咱们对应你的示例参数(args[1]是"pencil",args[2]是"YY")逐行验证:
- 第一行
pencil,XX,10:item是"pencil",所以!item.equals(args[1])为false,整个条件不成立,不写入; - 第二行
eraser,YY,rectangle:property1是"YY",!property1.equals(args[2])为false,整个条件不成立,不写入; - 第三行
sharpener,YY,new:同上,property1是"YY",条件不成立,不写入; - 第四行
pencil,YY,12:两个子条件都为false,条件不成立,不写入;
所有行都不满足条件,输出自然为空。
修正逻辑条件
你需要把条件改成排除掉item等于args[1]且property1等于args[2]的行,也就是反向判断,有两种等价写法:
写法一(直接反向原过滤条件):
// 只要不是「item匹配参数且property1匹配参数」的行,就写入 if(!(item.equals(args[1]) && property1.equals(args[2]))) { printWriter.println(item + "," + property1 + "," + property2); }
写法二(用逻辑或表达保留规则):
// 只要item不匹配参数,或者property1不匹配参数,就写入 if(!item.equals(args[1]) || !property1.equals(args[2])) { printWriter.println(item + "," + property1 + "," + property2); }
这两种写法都能实现你的预期:只有当item和property1同时匹配参数时才过滤,其余行全部保留。
额外注意:Scanner的分隔符问题
虽然你说验证了匹配正常,但还是要提醒一个容易踩的坑:CSV文件用逗号分隔,而默认情况下Scanner的分隔符是空白字符(空格、换行等),如果没手动设置分隔符,scanner.next()会把整行内容当成一个字符串读取,这会导致字段匹配失败。建议初始化Scanner后设置正确的分隔符:
Scanner scanner = new Scanner(new File("你的CSV文件路径")); // 设置分隔符为逗号或者换行符,确保能正确读取每个字段 scanner.useDelimiter(",|\n");
这样就能保证item、property1、property2分别读取到每一行的三个字段啦。
内容的提问来源于stack exchange,提问作者ZephyrX
相关产品推荐
相关产品推荐

