You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:37:51