标签: opencsv

Scala:自动检测 CSV 文件中的分隔符/分隔符

我正在使用 OpenCSV 库来拆分我的 CSV 文件。现在我需要绝对确定地检测分隔符/分隔符。我在网上搜索过,但我只找到了一些例子,你可以创建一个候选人列表并尝试其中一个。我认为这不是最好的方法,因为您可能会出错。我的拆分器应该可以在任何 CSV(我无法控制)上正常工作,因此它必须尽可能通用。有没有人有好的解决方案?

csv split scala separator opencsv

5
推荐指数
1
解决办法
6446
查看次数

Opencsv + 将新列添加到现有的 csv

是否有可能在现有的csv文件中添加一个新列,意味着

现有文件

userid,name
1,Jim
2,Sally
3,Bob
Run Code Online (Sandbox Code Playgroud)

修改后的输出文件

userid,name,time
1,Jim,64913824823208
2,Sally,64913824900056
3,Bob,64913824966956
Run Code Online (Sandbox Code Playgroud)

提前致谢

java opencsv

5
推荐指数
1
解决办法
6834
查看次数

使用 OpenCSV 写入 CSV 文件时双引号出现重复

我正在尝试使用库编写一个简单的CSVWriter代码OpenCSV,但遇到了一个奇怪的问题。

代码:

public class Test {

    public static void main(String[] args) throws IOException {

       String[] header = {"ONE", "\"TWO\"", "\"THREE\"", "\"FOUR\""};

       CSVWriter writer = new CSVWriter(new FileWriter("C:/test.csv"), '|', CSVWriter.NO_QUOTE_CHARACTER);

       writer.writeNext(header);

       writer.flush();       
       writer.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

预期输出:

ONE|"TWO"|"THREE"|"FOUR"

实际输出:

ONE|""TWO""|""THREE""|""FOUR""

正如我们所看到的,TWO、THREE 和 FOUR 周围有双引号,但在输出中双引号是重复的

我不想要这个,已经尝试了几个选项和CSVWriter类的构造函数,但无法解决这个问题。

有人遇到过类似的问题或知道出路吗?

谢谢

java opencsv

5
推荐指数
1
解决办法
3751
查看次数

使用 OpenCSV 解析 CSV,并在带引号的字段内添加双引号

我正在尝试使用 OpenCSV 解析 CSV 文件。其中一列以 YAML 序列化格式存储数据,并用引号引起来,因为其中可以包含逗号。它里面也有引号,所以通过加两个引号来转义。我可以在 Ruby 中轻松解析该文件,但使用 OpenCSV 我无法完全解析它。它是一个UTF-8编码的文件。

这是我的 Java 片段,它试图读取文件

CSVReader reader = new CSVReader(new InputStreamReader(new FileInputStream(csvFilePath), "UTF-8"), ',', '\"', '\\');
Run Code Online (Sandbox Code Playgroud)

以下是该文件中的 2 行。我猜第一行没有被正确解析,并且""[Fair Trade Certified]""由于转义双引号而被分割。

1061658767,update,1196916,Product,28613099,Product::Source,"---
product_attributes:
-
- :name: Ornaments
  :brand_id: 49120
  :size: each
  :alcoholic: false
  :details: ""[Fair Trade Certified]""
  :gluten_free: false
  :kosher: false
  :low_fat: false
  :organic: false
  :sugar_free: false
  :fat_free: false
  :vegan: false
  :vegetarian: false
",,2015-11-01 00:06:19.796944,,,,,,
1061658768,create,,,28613100,Product::Source,"---
product_id:
retailer_id:
store_id:
source_id: 333790
locale: en_us
source_type: Product::PrehistoricProductDatum
priority: 1
is_definition:
product_attributes: …
Run Code Online (Sandbox Code Playgroud)

java csv opencsv

5
推荐指数
1
解决办法
7584
查看次数

用Java读取大型CSV文件

我正在尝试用 Java读取1,000,000行 CSV 文件。我正在使用 OpenCSV 库,它在30,000行的较小文件上运行良好。不到半秒即可处理完毕。但是当我尝试读取一百万行文件时,它永远不会完成。

现在我测试了一下,看看它什么时候会真正停止,通过使用我自己的二分搜索版本,我首先尝试读取500k行,然后是250k,依此类推,我发现它很容易读取145k行,在0.5- 0.7秒,而150k甚至还没有完成。

我已经彻底搜索过,找到了我在代码中使用的几种解决方案,例如 usingBufferedReaderBufferedInputStream,但没有一个解决了这个问题。但在145-150k行之间仍然失败。

这是我的代码的相关部分(将150000 与 145000交换是导致程序在 <1 秒内执行的原因):

try {
       // BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("myFile.csv"));
        CSVReader csvReader = new CSVReader(new InputStreamReader
                (new BufferedInputStream(new FileInputStream("myFile.csv"), 8192 * 32)));
        try {
            int count = 0;
            String[] line;
            long timeStart = System.nanoTime();
            while((line = csvReader.readNext()) != null){
                count ++;
                if(count >= …
Run Code Online (Sandbox Code Playgroud)

java buffer file large-files opencsv

5
推荐指数
1
解决办法
6138
查看次数

在java中解析大型CSV文件的最快且有效的方法

我想尽可能快速高效地解析大型 CSV 文件。

目前,我正在使用 openCSV 库来解析我的 CSV 文件,但解析一个包含 10776 条记录和 24 个标题的 CSV 文件大约需要 10 秒,我想解析一个包含数百万条记录的 CSV 文件。

<dependency>
  <groupId>com.opencsv</groupId>
  <artifactId>opencsv</artifactId>
  <version>4.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我正在使用 openCSV 库使用下面的代码片段进行解析。

public List<?> convertStreamtoObject(InputStream inputStream, Class clazz) throws IOException {
        HeaderColumnNameMappingStrategy ms = new HeaderColumnNameMappingStrategy();
        ms.setType(clazz);
        Reader reader = new InputStreamReader(inputStream);

        CsvToBean cb = new CsvToBeanBuilder(reader)
                .withType(clazz)
                .withMappingStrategy(ms)
                .withSkipLines(0)
                .withSeparator('|')
                .withFieldAsNull(CSVReaderNullFieldIndicator.EMPTY_SEPARATORS)
                .withThrowExceptions(true)
                .build();
        List<?> parsedData = cb.parse();
        inputStream.close();
        reader.close();
        return parsedData;
    }
Run Code Online (Sandbox Code Playgroud)

我正在寻找另一种方法的建议,以在更短的时间内解析包含数百万条记录的 CSV 文件。

---更新了答案----

 Reader reader = new InputStreamReader(in);
        CSVParser csvParser = new …
Run Code Online (Sandbox Code Playgroud)

csv parsing opencsv java-8

5
推荐指数
1
解决办法
6170
查看次数

如何使用 opencsv 构建(工作)自定义转换器

我正在使用带有嵌套 bean 结构的 OpenCSV。但是,我需要一个自定义转换器来实现这一点(目前专注于写入 csv 部分)。我环顾四周,但没有找到任何示例来帮助我弄清楚如何使其工作。

我尝试扩展我的子 bean 类,并在主文档中提供了一些转换。但是我的资源已经用完了,我来得最远的是让它抛出一个 CsvBadConverterException。

让我告诉你我有什么。(User 和 UserScore 都实现了 Serializable,以防万一。)父 bean:User

    @CsvBindByName(column = "username")
    private String userName;
    @CsvBindByName(column = "password")
    private String userPassword;
    @CsvBindByName(column = "rememberPassword")
    private boolean rememberPassword;
    @CsvBindByName(column = "rememberUser")
    private boolean rememberUser;
    @CsvCustomBindByName(column = "scores", converter = UserScoreToBean.class)
    private UserScore userScore;

    // Constructors, getters, setters, and other methods
Run Code Online (Sandbox Code Playgroud)

子 bean:UserScore

    @CsvBindByName(column = "totalScore")
    private int totalScore;
    @CsvBindByName(column = "currentScore")
    private int currentScore;
    @CsvBindByName(column = "highestStreak")
    private int highestStreak;

    // Even more basic …
Run Code Online (Sandbox Code Playgroud)

java converters opencsv

5
推荐指数
1
解决办法
2789
查看次数

OpenCSV:将嵌套 Bean 映射到 CSV 文件

我正在尝试将 bean 映射到 CSV 文件,但问题是我的 bean 具有其他嵌套 bean 作为属性。发生的事情是 OpenCSV 通过属性找到一个 bean,然后进入它并映射该 bean 中的所有数据,如果它找到另一个 bean,它会继续下去。如何使用 OpenCSV 处理嵌套 bean?如何确保它映射了嵌套 bean 的正确属性?

java spring javabeans opencsv

5
推荐指数
1
解决办法
2253
查看次数

如何更改opencsv的默认分隔符?

首先,您好,对于初学者的问题感到抱歉,但我已经看到了文档和教程,但我无法让它在我的代码上运行。也许我犯了一个小错误,但我无法抓住它。

我在 Maven 项目中使用最新版本的 opencsv。所以我需要制作一个 .csv 文件,为此我使用:

try (CSVWriter writer = new CSVWriter(new FileWriter("file.csv", true)) {
    /* code
}
Run Code Online (Sandbox Code Playgroud)

一切正常,但我需要使用不同的分隔符,所以我尝试使用:

try (CSVWriter writer = new CSVWriter(new FileWriter("file.csv", true), '-') {
    /* code
}
Run Code Online (Sandbox Code Playgroud)

但在 IntelliJ 中出现无法解析构造函数 'CSVWriter(java.io.FileWriter, char)',当文档中显示opencsv 文档时

知道如何修复它吗?(抱歉我的英语,我不是母语人士)。

java opencsv

5
推荐指数
1
解决办法
7900
查看次数

OpenCsv:我可以指定一次区域设置,而不是在每个 @CsvBindByName 中重复它吗?

我正在使用OpenCSV来解析 csv 文件,这些文件在英国和德国运行时都需要工作。解析数字时,我们需要指定区域设置,以便 OpenCSV 知道哪个小数点分隔符(“.”表示英国,“,”表示德国)和千位分隔符(“,”表示英国,“.”表示德国)

执行此操作的一种选择是在每个@CsvBindByName实例上指定区域设置

public class MyRowBackingBean {
    @CsvBindByName(column = "Quantity", locale = "en-GB")
    @CsvNumber("#0.0#")
    private BigDecimal quantity;

    @CsvBindByName(column = "Amount", locale = "en-GB")
    @CsvNumber("#0.0#")
    private BigDecimal amount;
}
Run Code Online (Sandbox Code Playgroud)

我想避免为每个字段重复区域设置,因此我希望采用全局方式来执行此操作。

解析 csv 的代码如下所示:

char seperator = ';';
CSVParser parser = new CSVParserBuilder().withSeparator(separator).build();
MappingStrategy<R> mappingStrategy = new HeaderColumnNameMappingStrategy<>();
mappingStrategy.setType(MyRowBackingBean.class);
try (Reader reader = ...) {
   CSVReader csvReader = new CSVReaderBuilder(reader).withCSVParser(csvParser).build();
   CsvToBean<R> csvToBean = new CsvToBeanBuilder<R>(csvReader)
      .withMappingStrategy(mappingStrategy)
      .withFilter(...)
      .build();
   List<MyRowBackingBean> beans = csvToBean.parse()
   ...
}
Run Code Online (Sandbox Code Playgroud)

我查看了以下类,但找不到 setDefaultLocale(...) …

java locale number-formatting opencsv

5
推荐指数
0
解决办法
2479
查看次数