【问题标题】:Separating CSV file with split function and IGNORING quotes [closed]使用拆分功能和忽略引号分隔 CSV 文件 [关闭]
【发布时间】:2020-12-19 16:02:04
【问题描述】:

我有一个来自 csv 文件的字符串 = "10","100","11","1" 我想在 Java 上将它拆分成这样的数组:

10,100,11,1

我一直在使用这段代码,但我需要在“不包含引号”中添加一部分,是吗 可能的?如果没有,我怎么能轻松地从中获取整数值

String str = "\"10\",\"100\",\"11\",\"1\"";
String[] tokens = str.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1);

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 您想要的结果类型是什么?有关系吗?也许是int[]List<Integer>Integer[]?一切皆有可能……
  • @deHaar 每个拆分后的值都作为一个整数进入数组列表,但就我知道如何删除引号而言,我可以处理剩下的,谢谢!

标签: java regex string csv split


【解决方案1】:

您可以通过以下方式获取String[]

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String str = "\"10\",\"100\",\"11\",\"1\"";

        // Replace double quote with blank
        str = str.replace("\"", "");

        // Split the resulting string on comma
        String[] arr = str.split(",");

        // Display the resulting array
        System.out.println(Arrays.toString(arr));
    }
}

输出:

[10, 100, 11, 1]

或者,

import java.util.List;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String str = "\"10\",\"100\",\"11\",\"1\"";
        List<Integer> list=Pattern.compile("\\d+")
                          .matcher(str)
                          .results()
                          .map(MatchResult::group)
                          .map(Integer::valueOf)
                          .collect(Collectors.toList());
        
        System.out.println(list);
    }
}

请注意,替代解决方案返回List&lt;Integer&gt;。如果您需要List&lt;String&gt;,请从中删除.map(Integer::valueOf)

【讨论】:

  • 请注意,这仅在数据不需要引号时才合理(因此没有字符串或带有实际逗号的本地化浮点数)。
  • @Zabuzard - 我完全同意你的看法。我的回答完全基于问题中提到的输入和输出。
  • @Zabuzard 好点,但 OP 清楚地表现出对 整数值 的兴趣,所以我认为这个答案完成了大部分所需的工作,但跳过了类型转换。
  • 不错的选择...Pattern.compile,没想到。
  • 谢谢! str = str.replace("\"", ""); 帮助了我,但后来我必须使用 CSV 处理带有逗号和必要引号的随机数据,正如@Zabuzard 提到的那样,但这加上我的正则表达式代码可能辛苦了,谢谢大家
【解决方案2】:

如果您愿意使用不需要正则表达式但使用流 API 的解决方案,您可以只使用逗号 splitString,流式传输结果,删除每个项目周围的双引号,然后将其解析为int:

public static void main(String[] args) {
    String str = "\"10\",\"100\",\"11\",\"1\"";
    // stream the results of splitting by comma
    List<Integer> numbers = Arrays.stream(str.split(","))
                                // parse the int after removíng the double-quotes
                                .map(s -> Integer.parseInt(s.replace("\"", "")))
                                // and return a list of integers
                                .collect(Collectors.toList());
    // then print the integers
    numbers.forEach(System.out::println);
}

这个输出

10
100
11
1

作为替代方案,您也可以创建一个int[] 而不是List&lt;Integer&gt;,这是如何做到这一点的(输出与上图相同):

public static void main(String[] args) {
    String str = "\"10\",\"100\",\"11\",\"1\"";
    // stream the results of splitting by comma
    int[] numbers = Arrays.stream(str.split(","))
                                // parse and map to int after removíng the double-quotes
                                .mapToInt(s -> Integer.parseInt(s.replace("\"", "")))
                                // and make it an array
                                .toArray();
    // then print the integers
    Arrays.stream(numbers).forEach(System.out::println);
}

【讨论】:

  • 这是完整的答案。我错过了 OP 还需要将每个字符串转换为 int 的要求。
  • 你的回答确实帮助我搜索和学习流(对我来说是新的!!),我的错误是我没有指定我必须使用正则表达式,我会学习更多的流,因为每个外部库或我的代码上的 api 必须写在我的报告上(大学项目)谢谢!!!
【解决方案3】:

试试这个,

String str = "\"10\",\"100\",\"11\",\"1\"";

String[] arr = str.replaceAll("(^\"|\"$)","").split("\",\"");

System.out.println(Arrays.toString(arr));

【讨论】:

    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多