我正在使用 OpenCSV 库来拆分我的 CSV 文件。现在我需要绝对确定地检测分隔符/分隔符。我在网上搜索过,但我只找到了一些例子,你可以创建一个候选人列表并尝试其中一个。我认为这不是最好的方法,因为您可能会出错。我的拆分器应该可以在任何 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)
提前致谢
我正在尝试使用库编写一个简单的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类的构造函数,但无法解决这个问题。
有人遇到过类似的问题或知道出路吗?
谢谢
我正在尝试使用 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读取1,000,000行 CSV 文件。我正在使用 OpenCSV 库,它在30,000行的较小文件上运行良好。不到半秒即可处理完毕。但是当我尝试读取一百万行文件时,它永远不会完成。
现在我测试了一下,看看它什么时候会真正停止,通过使用我自己的二分搜索版本,我首先尝试读取500k行,然后是250k,依此类推,我发现它很容易读取145k行,在0.5- 0.7秒,而150k甚至还没有完成。
我已经彻底搜索过,找到了我在代码中使用的几种解决方案,例如 usingBufferedReader等BufferedInputStream,但没有一个解决了这个问题。但在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) 我想尽可能快速高效地解析大型 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) 我正在使用带有嵌套 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) 我正在尝试将 bean 映射到 CSV 文件,但问题是我的 bean 具有其他嵌套 bean 作为属性。发生的事情是 OpenCSV 通过属性找到一个 bean,然后进入它并映射该 bean 中的所有数据,如果它找到另一个 bean,它会继续下去。如何使用 OpenCSV 处理嵌套 bean?如何确保它映射了嵌套 bean 的正确属性?
首先,您好,对于初学者的问题感到抱歉,但我已经看到了文档和教程,但我无法让它在我的代码上运行。也许我犯了一个小错误,但我无法抓住它。
我在 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 文档时
知道如何修复它吗?(抱歉我的英语,我不是母语人士)。
我正在使用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(...) …