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
相关产品推荐
相关产品推荐

