如何将CSV每行文本导入ArrayList<String>并通过StringTokenizer统计交易
解决方法
1. 给getTokens()传参
在main方法最后一行,把存好数据的ArrayList传进去:
getTokens(list);
2. 实现带参数的getTokens()方法
方法需要接收ArrayList<String>类型的参数,遍历每一行数据,用StringTokenizer拆分CSV字段,统计交易类型。示例代码如下(记得根据你的CSV结构调整交易类型所在的列索引):
public static void getTokens(ArrayList<String> transactionLines) { int total = transactionLines.size(); int debitNum = 0; int creditNum = 0; for (String line : transactionLines) { // 用逗号拆分CSV行 StringTokenizer tokenizer = new StringTokenizer(line, ","); String transType = ""; int colIndex = 0; // 遍历拿到交易类型对应的列(假设是第3列,自己改数字) while (tokenizer.hasMoreTokens()) { colIndex++; String token = tokenizer.nextToken().trim(); if (colIndex == 3) { transType = token; break; } } // 统计借记/贷记 if ("DEBIT".equalsIgnoreCase(transType)) { debitNum++; } else if ("CREDIT".equalsIgnoreCase(transType)) { creditNum++; } } // 输出结果 System.out.println("交易总数:" + total); System.out.println("借记交易:" + debitNum + " 笔"); System.out.println("贷记交易:" + creditNum + " 笔"); }
3. 优化原main方法的小问题
原代码有几个可以改进的地方,比如Scanner的定义、资源关闭,还有交易数可以直接用list的size()获取:
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Scanner; import java.util.StringTokenizer; public class CreditCardStats { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); Scanner s = null; try { s = new Scanner(new File("visadata.csv")); // 直接循环读取所有行 while (s.hasNextLine()) { list.add(s.nextLine()); } System.out.println("There are " + list.size() + " transactions"); } catch (FileNotFoundException e) { System.out.println("File Not Found"); } finally { // 记得关闭Scanner if (s != null) { s.close(); } } getTokens(list); } // 把上面的getTokens方法放在这里 public static void getTokens(ArrayList<String> transactionLines) { // ... 实现代码 } }
注意事项
- 一定要根据你的
visadata.csv实际列顺序,修改colIndex == 3中的数字,确保能正确拿到交易类型字段。 - 如果你的CSV字段里包含逗号(比如带双引号的内容),
StringTokenizer可能会拆分出错,这种情况建议用专门的CSV解析工具,但简单场景下StringTokenizer足够用。
内容的提问来源于stack exchange,提问作者Kyle Tse
相关产品推荐
相关产品推荐

