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

Java中如何从CSV解析后的数组中索引获取特定值

如何从CSV解析后的数组中索引特定值

我已经用Java实现了逐行读取CSV文件,并将每行拆分存入数组,但不知道如何从这些数组中索引特定位置的值。比如想要获取位置[3,4]对应的“Andorra”,以及位置[6,6]对应的“17”。以下是CSV文件内容和我的代码:

CSV文件内容

Date,iso3,Continent,CountryName,lat,lon,CumulativePositive,CumulativeDeceased,CumulativeRecovered,CurrentlyPositive,Hospitalized,IntensiveCare,NUTS
31/1/2021,AFG,AS,Afghanistan,33.930445,67.678945,55023,2400,,52623,,,AF
31/1/2021,ALB,EU,Albania,41.156986,20.181222,78127,1380,47424,29323,324,19,AL
31/1/2021,DZA,AF,Algeria,28.026875,1.65284,107122,2888,,104234,,,DZ
31/1/2021,AND,EU,Andorra,42.542268,1.596865,9937,101,,9836,44,,AD
31/1/2021,AGO,AF,Angola,-11.209451,17.880669,19782,464,,19318,,,AO
31/1/2021,AIA,NA,Anguilla,18.225119,-63.07213,17,0,,17,,,AI
31/1/2021,ATG,NA,Antigua and Barbuda,17.363183,-61.789423,218,7,,211,,,AG
31/1/2021,ARG,SA,Argentina,-38.421295,-63.587403,1915362,47775,,1867587,,,AR
31/1/2021,ARM,AS,Armenia,40.066181,45.111108,167026,3080,,163946,,,AM
31/1/2021,ABW,NA,Aruba,12.517713,-69.965112,6858,58,,6800,,,AW
31/1/2021,AUS,OC,Australia,-26.853388,133.275154,28806,909,,27897,,,AU
31/1/2021,AUT,EU,Austria,47.697542,13.349319,411921,7850,383158,21058,1387,297,AT
31/1/2021,AZE,AS,Azerbaijan,40.147396,47.572098,229935,3119,,226816,,,AZ
31/1/2021,BHS,NA,Bahamas,24.885993,-76.709892,8174,176,,7998,,,BS
31/1/2021,BHR,AS,Bahrain,26.039722,50.559306,102626,372,,102254,,,BH
31/1/2021,BGD,AS,Bangladesh,23.68764,90.351002,535139,8127,,527012,,,BD
31/1/2021,BRB,NA,Barbados,13.18355,-59.534649,1498,12,,1486,,,BB
31/1/2021,BLR,EU,Belarus,53.711111,27.973847,248336,1718,,246618,,,BY
31/1/2021,BEL,EU,Belgium,50.499527,4.475402,711417,21118,,690299,1788,315,BE
31/1/2021,BLZ,NA,Belize,17.192929,-88.5009,11877,301,,11576,,,BZ
31/1/2021,BEN,AF,Benin,9.322048,2.313138,3786,48,,3738,,,BJ
31/1/2021,BMU,NA,Bermuda,32.320236,-64.774022,691,12,,679,,,BM
31/1/2021,BTN,AS,Bhutan,27.515709,90.442455,859,1,,858,,,BT
31/1/2021,BWA,AF,Botswana,-22.344029,24.680158,21293,134,,21159,,,BW
31/1/2021,BRA,SA,Brazil,-14.242915,-53.189267,9118513,222666,,8895847,,,BR
31/1/2021,VGB,NA,British Virgin Islands,18.573601,-64.492065,141,1,,140,,,VG

现有代码

public static String readFile(String file) {
    FileInputStream fileStream = null;
    InputStreamReader isr;
    BufferedReader bufRdr;
    int lineNum;
    String line = null;
    try {
        fileStream = new FileInputStream(file);
        isr = new InputStreamReader(fileStream);
        bufRdr = new BufferedReader(isr);
        lineNum = 0;
        line = bufRdr.readLine();
        while ((line != null) && lineNum < 27) {
            lineNum++;
            System.out.println(line);
            line = bufRdr.readLine();
        }
        fileStream.close();
    }
    catch (IOException e) {
        if (fileStream != null) {
            try {
                fileStream.close();
            }
            catch (IOException ex2) {
            }
        }
        System.out.println("Error: " + e.getMessage());
    }
    return line;
}

private static void processLine(String line) {
    String[] splitLine;
    splitLine = line.split(",");
    int lineLength = splitLine.length;

    for (int i = 0; i < lineLength; i++) {
        System.out.print(splitLine[i] + " ");
    }
    System.out.println("");
}

解决步骤

1. 存储所有解析后的行数据

现有代码仅逐行打印数据,未保留解析结果。需要将每行拆分后的数组存入List<String[]>,这样就能通过索引访问任意行和列。

2. 明确索引对应关系

Java数组和List的索引均从0开始,而你提到的位置是从1开始计数,对应关系如下:

  • 你说的行号N → 对应List的索引N-1(第一行表头为索引0)
  • 你说的列号M → 对应数组的索引M-1

例如:

  • 位置[3,4]:行3对应List索引3(第4行数据),列4对应数组索引3,值为"Andorra"
  • 位置[6,6]:行6对应List索引5(第7行数据),列6对应数组索引5,值为"17"

3. 修改后的完整代码

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class CsvReader {
    // 读取CSV并返回所有行的解析结果
    public static List<String[]> readCsvFile(String file) {
        List<String[]> csvData = new ArrayList<>();
        // 使用try-with-resources自动关闭资源,简化代码
        try (FileInputStream fileStream = new FileInputStream(file);
             InputStreamReader isr = new InputStreamReader(fileStream);
             BufferedReader bufRdr = new BufferedReader(isr)) {

            String line;
            while ((line = bufRdr.readLine()) != null) {
                String[] splitLine = line.split(",");
                csvData.add(splitLine);
                // 可选:打印每行数据,和原代码功能一致
                processLine(line);
            }
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
        return csvData;
    }

    private static void processLine(String line) {
        String[] splitLine = line.split(",");
        for (String field : splitLine) {
            System.out.print(field + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        List<String[]> csvData = readCsvFile("your-csv-file-path.csv");
        
        // 获取位置[3,4]的"Andorra"
        if (csvData.size() > 3 && csvData.get(3).length > 3) {
            String andorra = csvData.get(3)[3];
            System.out.println("位置[3,4]的值: " + andorra);
        }

        // 获取位置[6,6]的"17"
        if (csvData.size() > 5 && csvData.get(5).length > 5) {
            String seventeen = csvData.get(5)[5];
            System.out.println("位置[6,6]的值: " + seventeen);
        }
    }
}

说明

  • 使用try-with-resources自动管理流资源,避免手动关闭可能出现的错误
  • readCsvFile方法返回List<String[]>,存储所有行的解析结果
  • 在main方法中,通过csvData.get(行索引)[列索引]获取特定值,同时添加边界判断避免数组越界异常
  • 如果CSV字段中包含逗号(如带引号的字段),split(",")会失效,这种情况建议使用成熟的CSV解析库,但当前你的CSV无此问题,上述代码可正常运行。

内容的提问来源于stack exchange,提问作者Francois200212

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:11:28