Java无外部库处理CSV:移除重复逗号与£符号并按价格排序
解决CSV处理中的正则错误与完整需求实现
首先,你的正则表达式写法有误,导致所有逗号被误删。[,{2}|£]是一个字符类,它会匹配其中的任意单个字符(包括逗号、{、2、}、|、£),所以自然会把所有逗号都去掉。我们需要分开处理重复逗号和英镑符号:
第一步:修正正则替换逻辑
要保留字段间的单个逗号,同时移除连续重复的逗号和£符号,应该分两步替换:
- 用
,{2,}匹配连续2个及以上的逗号,替换为单个逗号 - 用
£匹配英镑符号,直接替换为空
修正后的替换代码如下:
// 先处理重复逗号,再移除£符号,同时可以去掉首尾空格避免干扰 String cleanedLine = line.trim() .replaceAll(",{2,}", ",") .replaceAll("£", "");
这样处理后,你的示例输入18,5 Ramsey Lane,See,Amerighi,samerighih@trellian.com,,£307018.48, 会变成18,5 Ramsey Lane,See,Amerighi,samerighih@trellian.com,307018.48,保留了正常的字段分隔逗号。
第二步:完整实现排序与取前n行
接下来需要实现按价格排序并返回前n行的功能,我们可以创建一个简单的类来封装每行数据和对应的价格,这样排序会更清晰。这里给出完整的实现代码:
1. 定义数据封装类
// 用于存储每行CSV数据和对应的价格,方便排序 static class Property { String line; double price; public Property(String line, double price) { this.line = line; this.price = price; } }
2. 修正后的getTopProperties方法
public String[] getTopProperties(int n) { List<Property> propertyList = new ArrayList<>(); String file = "data.csv"; String splitBy = ","; try (BufferedReader br = new BufferedReader(new FileReader(file))) { String line; while ((line = br.readLine()) != null) { if (line.trim().isEmpty()) continue; // 跳过空行 // 清理行数据:去重复逗号、去£、去首尾空格 String cleanedLine = line.trim() .replaceAll(",{2,}", ",") .replaceAll("£", ""); // 拆分字段,提取价格(假设价格是最后一个字段,根据你的示例调整) String[] fields = cleanedLine.split(splitBy); if (fields.length < 2) continue; // 跳过格式错误的行 double price; try { // 提取价格字段并去掉可能的空格 price = Double.parseDouble(fields[fields.length - 1].trim()); } catch (NumberFormatException e) { System.err.println("无效价格行:" + cleanedLine); continue; // 跳过价格格式错误的行 } propertyList.add(new Property(cleanedLine, price)); } } catch (IOException e) { e.printStackTrace(); return new String[0]; // 读取失败返回空数组 } // 按价格降序排序(如果要升序,去掉Comparator.reverse()即可) propertyList.sort((p1, p2) -> Double.compare(p2.price, p1.price)); // 取前n行,处理列表长度小于n的情况 int takeCount = Math.min(n, propertyList.size()); String[] result = new String[takeCount]; for (int i = 0; i < takeCount; i++) { result[i] = propertyList.get(i).line; } return result; }
关键细节说明
- 字段位置:代码中假设价格是每行的最后一个字段(根据你的示例),如果你的CSV价格位置不同,需要调整
fields[fields.length - 1]的索引。 - 异常处理:增加了对空行、格式错误行、价格解析错误行的处理,避免程序崩溃。
- 排序逻辑:默认按价格降序排列,如果你需要升序,修改
sort方法的比较器为Double.compare(p1.price, p2.price)即可。
这样就能完美实现你的需求:清理重复逗号和英镑符号,按价格排序后返回前n行数据。
内容的提问来源于stack exchange,提问作者Aaria
相关产品推荐
相关产品推荐

