我有一个包含以下内容的csv
EANHotelID|SequenceNumber|Name|Address1|Address2|City|StateProvince|PostalCode|Country|Latitude|Longitude|AirportCode|PropertyCategory|PropertyCurrency|StarRating|Confidence|SupplierType|Location|ChainCodeID|RegionID|HighRate|LowRate|CheckInTime|CheckOutTime
541454|99999999|Hotel Maan Residency|"B" Wing, Gopal Palace, opp. ocean park|Naherunagar-Satellite Road|Ahmedabad||380 015|IN|23.02266|72.53842|AMD|1|INR|3.0||ESR|Near Kankaria Lake|||0|0|10:00 AM|10:00 AM
Run Code Online (Sandbox Code Playgroud)
现在,我尝试使用以下代码将csv中的每一行作为一个对象读取
CsvMapper mapper = new CsvMapper();
mapper.findAndRegisterModules();
File csvFile = new File("D:\\ActivePropertyList.txt.bak2");
CsvSchema schema = CsvSchema.emptySchema().withHeader().withColumnSeparator('|').withNullValue("");
MappingIterator<Map<String,String>> it = mapper.readerFor(Map.class).with(schema)
.readValues(csvFile);
while (it.hasNextValue()) {
Map<String,String> value = it.nextValue();
}
Run Code Online (Sandbox Code Playgroud)
但这是由于"B"csv中存在的原因而失败。我收到以下错误:
由以下原因引起:com.fasterxml.jackson.core.JsonParseException:意外的字符(“ W”(代码87)):预期的分隔符(““”(代码34))或行尾位于[来源:(com.fasterxml .jackson.dataformat.csv.impl.UTF8Reader);第2行,第43列]
如何正确解析csv中的双引号?我尝试玩耍,schema.withEscapeChar() schema.withQuoteChar()但无法正常工作。
我想创建一个 Spring Boot 控制器,它使用流中的数据创建 CSV 文件。我使用 Jackson CSV (jackson-dataformat-csv 2.12.1) 将数据流从数据库写入 StreamingResponseBody。
为了简单起见,我将数据库中的实际数据替换为包含1, 2, 3. 我想要一个如下所示的 CSV 文件:
1
2
3
Run Code Online (Sandbox Code Playgroud)
但它只包含第一个条目 ( 1)。有人可以帮我找出问题吗?
请注意,我不想在服务器上的某个位置创建文件,我想将内容直接流式传输给用户。
我的代码如下所示:
1
2
3
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用解析 CSV 文件,jackson-dataformat-csv并且我想将数字列映射到 Number java 类型。
CsvSchema schema = CsvSchema.builder().setUseHeader(true)
.addColumn("firstName", CsvSchema.ColumnType.STRING)
.addColumn("lastName", CsvSchema.ColumnType.STRING)
.addColumn("age", CsvSchema.ColumnType.NUMBER)
.build();
CsvMapper csvMapper = new CsvMapper();
MappingIterator<Map<String, Object>> mappingIterator = csvMapper
.readerFor(Map.class)
.with(schema)
.readValues(is);
while (mappingIterator.hasNext()) {
Map<String, Object> entryMap = mappingIterator.next();
Number age = (Number) entryMap.get("age");
}
Run Code Online (Sandbox Code Playgroud)
我期待entryMap.get("age")应该是 a Number,但我得到了String。
我的 CSV 文件:
firstName,lastName,age
John,Doe,21
Error,Name,-10
Run Code Online (Sandbox Code Playgroud)
我知道这CsvSchema适用于 POJO,但我需要处理任意 CSV 模式,因此我无法为每种情况创建一个新的 java 类。
有什么方法可以将 CSV 解析为类型Map或Array?
尝试使用 jackson-dataformat-csv 解析 .csv 文件。文件包含许多与我的程序无关的列。
试图@JsonIgnoreProperties(ignoreUnknown = true)在我的数据类上使用and csvMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES),但都不起作用,并且应用程序抛出异常:
com.fasterxml.jackson.databind.RuntimeJsonMappingException: Too many entries: expected at most 2 (value #2 (17 chars) "policy_issue_date")
at [Source: (com.fasterxml.jackson.dataformat.csv.impl.UTF8Reader); line: 1, column: 37]
at com.fasterxml.jackson.databind.MappingIterator.next(MappingIterator.java:194)
at pl.polins.readers.oc.OcPolicyCsvReader.readNext(OcPolicyCsvReader.kt:25)
at pl.polins.readers.oc.OcPolicyCsvReaderTest.should read PolicyCsv from .csv file(OcPolicyCsvReaderTest.groovy:19)
Caused by: com.fasterxml.jackson.dataformat.csv.CsvMappingException: Too many entries: expected at most 2 (value #2 (17 chars) "policy_issue_date")
at [Source: (com.fasterxml.jackson.dataformat.csv.impl.UTF8Reader); line: 1, column: 37]
at com.fasterxml.jackson.dataformat.csv.CsvMappingException.from(CsvMappingException.java:23)
at com.fasterxml.jackson.dataformat.csv.CsvParser._reportCsvMappingError(CsvParser.java:1210)
at com.fasterxml.jackson.dataformat.csv.CsvParser._handleExtraColumn(CsvParser.java:965)
at com.fasterxml.jackson.dataformat.csv.CsvParser._handleNextEntry(CsvParser.java:826)
at com.fasterxml.jackson.dataformat.csv.CsvParser.nextToken(CsvParser.java:580)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:418)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1266)
at …Run Code Online (Sandbox Code Playgroud) 出于某种原因,尽管配置了 FasterXML Jackson CSV 映射器来创建基于 POJO 的架构,但它坚持认为没有提供合适的配置。我收到以下异常:
com.fasterxml.jackson.databind.JsonMappingException: No value type configured for ObjectReader
com.fasterxml.jackson.databind.ObjectReader._findRootDeserializer(ObjectReader.java:1371)
com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1265)
com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:897)
aol.model.core.services.admin.CSVParserService.parseCSVFileStreamAsClass(CSVParserService.java:42)
aol.rest.controller.AdminController.importCsvData(AdminController.java:30)
aol.rest.controller.AdminController$$FastClassBySpringCGLIB$$b9304c43.invoke(<generated>)
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
...
Run Code Online (Sandbox Code Playgroud)
我的POJO很简单
@JsonPropertyOrder({"firstName", "lastName", "age"})
public class Person {
String firstName;
String lastName;
Integer age;
public Person() {} //no other use than to avoid no-suitable-construction found issue
//getters and setters omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
我的解析代码是
public MappingIterator<Person> parseCSVFileStreamAsClass(MultipartFile file) throws IOException {
StringBuilder lines = new StringBuilder();
String lineSeparator = System.getProperty("line.separator");
try(BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) {
for …Run Code Online (Sandbox Code Playgroud) 我的用例是编写一个通用的 CSV 转换器,它应该能够将任何 Java POJO 转换为 CSV 字符串。
我的实现:
public <T> List<String> convertToString(List<T> objectList) {
List<String> stringList = new ArrayList<>();
char delimiter = ',';
char quote = '"';
String lineSep = "\n";
CsvMapper mapper = new CsvMapper();
CsvSchema schema = mapper.schemaFor(!HOW_TO!);
for (T object : objectList) {
try {
String csv = mapper.writer(schema
.withColumnSeparator(delimiter)
.withQuoteChar(quote)
.withLineSeparator(lineSep)).writeValueAsString(object);
} catch (JsonProcessingException e) {
System.out.println(e);
}
}
return stringList;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 Jackson-dataformat-csv 库,但我坚持使用 !HOW_TO!部分,即如何从objectList中提取对象的.class。我正在学习并遇到了类型擦除,所以我认为除了将 .class 作为我的函数的参数之外,这是不可能的。但我也使用 Java 反射从通用实体中提取此对象列表,因此我无法选择提供 .class 参数。
有解决方法吗?
或者
我可以转换具有 …
java csv generics jackson-dataformat-csv amazon-kinesis-firehose
我一直在尝试将对象序列化为CSV,String但是该对象包含List,@JsonUnwrapped并且不能在List对象上使用。
预期样本输出:
color,part.name\n
red,gearbox\n
red,door\n
red,bumper
Run Code Online (Sandbox Code Playgroud)
实际输出:
com.fasterxml.jackson.core.JsonGenerationException: Unrecognized column 'name':
Run Code Online (Sandbox Code Playgroud)
这是我的代码:(其中大多数是2个POJO)
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import java.io.IOException;
import static java.util.Arrays.asList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
public class NestedWrapping {
@JsonRootName("Car")
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE)
@JsonPropertyOrder({"color"})
public static class Car {
@JsonProperty("color")
private String color;
@JsonFormat(shape = JsonFormat.Shape.STRING) …Run Code Online (Sandbox Code Playgroud)