【问题标题】:Java - Splitting data into a 2D arrayJava - 将数据拆分为二维数组
【发布时间】:2012-03-12 19:18:04
【问题描述】:

我有一个名为purchaseData 的数据字符串,它被分成带有"\n" 的行和带有"," 的字段(CSV 格式)。

如何创建一个二维字符串数组,以便该数组包含包含每个字段的数组。因此对于String[i][j]i 将是行值(行的位置),j 将是字段在所选数据数组(行)中的位置。

【问题讨论】:

  • 你有没有尝试过?我推荐的是一个嵌入式循环(外部获取下一行,内部获取该行的字段)。我可以给你代码,但我想知道你到目前为止尝试了什么。

标签: java arrays split


【解决方案1】:

您可以使用 String#split 创建二维数组,如下所示:

String str = "a,b,c,d,e,f\ng,h,i,j,k,l\nm,n,o,p,q,r";
String[] arr = str.split("\n");
String[][] csv = new String[arr.length][];
for(int r=0; r<arr.length; r++)
    csv[r] = arr[r].split(",");

更新: 由于 Max 评论(我同意)我的原始答案不适用于 RFC 4180 type CSV,因此我在此处发布更新以解析那些复杂的 CSV 数据,如下例所示:

String str =
  "m,n,o,\"p\nx\",q,r\n\"abc,123\",\"45,12\",\"a,aa\",\"b,bb\",\"c,cc\",\"fo\no,bar\"";

String[] arr = str.split("\n\\s*(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
String[][] csv = new String[arr.length][];
for(int r=0; r<arr.length; r++)
    csv[r] = arr[r].split(",\\s*(?=([^\"]*\"[^\"]*\")*[^\"]*$)");

测试:

for(int r=0; r<csv.length; r++)
    System.out.println(Arrays.toString(csv[r]));

输出:

[m, n, o, "p
x", q, r]
["abc,123", "45,12", "a,aa", "b,bb", "c,cc", "fo
o,bar"]

【讨论】:

  • +1,但是如果有问题的格式是 RFC 4180 类型的 CSV,那么只有适当的解析器才能解析它。例如,这是具有 3 列的正确 CSV:"abc,123","2345\n12","a,aa""b,bb""c,cc"
  • 完全同意@Max 只有合适的解析器才能处理这些 CSV 数据。
  • @Max:我已经在我的答案中发布了一个 更新,它也应该适用于 RFC 4180 类型的 CSV。
【解决方案2】:
    String str = "YOUR_VERY_LONG_STRING";
    String[] lines = str.split("\n");
    String[][] linesCsv = new String[lines.length][];

    for (int i=0; i<lines.length; i++) {
        linesCsv[i] = lines[i].split(",");
    }

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 2014-08-28
    • 2021-01-30
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    相关资源
    最近更新 更多