我使用下面的Java代码创建了一个CSV文件:
String csv = rs.getString("UPLOAD_FOLDER_PATH")+".csv";
CSVWriter writer = new CSVWriter(new FileWriter(csv));
String [] filevalues = new String[filevaluesarray.size()];
filevalues=filevaluesarray.toArray(filevalues);
writer.writeNext(filevalues);
writer.close();
Run Code Online (Sandbox Code Playgroud)
我收到了CSV文件,但该文件的内容包含不需要的双引号.
例如."ABC", "123", "KDNJ"
我不会从添加这些双引号的地方得到.
我有一个CSV有以下的列文件:id
,fname
,telephone
,lname
,address
.
我有一个Person
带班id
,fname
和lname
数据成员.我想只将这些列映射到Person
CSV文件中的对象,并丢弃telephone
和address
列.我怎样才能做到这一点?解决方案必须随着未来添加更多列而扩展.无论列位置如何都应该工作.
在理想的解决方案中,用户只会指定要读取的列,它应该可以正常工作.
我正在尝试使用SuperCSV将大量行(约200万)从数据库写入CSV文件.我需要在编写每个单元格时执行验证,内置的CellProcessors非常好.我想捕获CellProcessors抛出的所有异常,以便我可以返回源数据并进行更改.
问题是,当一行中存在多个错误时(例如,第一个值超出范围,第二个值为null但不应该是),只有第一个CellProcessor将执行,因此我只会看到一个的错误.我希望在一次传递中处理整个文件,并在其结尾处有一组完整的异常.
这是我正在尝试的方法:
for (Row row : rows) {
try {
csvBeanWriter.write(row, HEADER_MAPPINGS, CELL_PROCESSORS);
} catch (SuperCsvCellProcessorException e) {
log(e);
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?谢谢!
编辑:这是我写的代码类似于猎犬的代码,以防它帮助任何人:
import java.util.List;
import org.supercsv.cellprocessor.CellProcessorAdaptor;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.exception.SuperCsvCellProcessorException;
import org.supercsv.util.CsvContext;
public class ExceptionCapturingCellProcessor extends CellProcessorAdaptor {
private final List<Exception> exceptions;
private final CellProcessor current;
public ExceptionCapturingCellProcessor(CellProcessor current, CellProcessor next, List<Exception> exceptions) {
super(next);
this.exceptions = exceptions;
this.current = current;
}
@Override
public Object execute(Object value, CsvContext context) {
// Check input is not null
try { …
Run Code Online (Sandbox Code Playgroud) 我正在尝试从相当复杂的Java对象生成CSV文件.该对象是具有一些属性的会话,以及具有某些属性的字符串和消息列表以及具有某些属性的注释列表.
会话类如下;
public class Session {
private Long id;
private Date startDate;
private Date endDate;
private List<Message> messages;
private List<String> participants;
public TweetSession() {
}
public TweetSession(Date startDate, List<Message> messages, List<String> participants) {
this.startDate = startDate;
this.messages = messages;
this.participants = participants;
}
public Long getId() {
return id;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = …
Run Code Online (Sandbox Code Playgroud) 所以我正在解析.csv文件.我在StackOverflow上的某个地方接受了另一个线程的建议并下载了SuperCSV.我终于完成了一切工作,但现在我遇到了一个似乎很难解决的错误.
出现此问题的原因可能是也可能未填充最后两列数据.下面是.csv文件的示例,第一行缺少最后一列,第二行完全完成:
2012:07:25,11:48:20,922,"uLog.exe","",按键,1246,341,-1.00,-1.00,1.00,班次2012:07:25,11:48:21,094," uLog.exe","",按下键,1246,341,-1.00,-1.00,1.00,b,Shift
根据我对Super CSV Javadoc的理解,如果存在可变数量的列,则无法使用CsvBeanReader填充Java Bean .这似乎真的很愚蠢,因为我觉得在初始化Bean时,应该允许这些缺少的列为null或其他一些默认值.
作为参考,这是我的解析器的完整代码:
public class ULogParser {
String uLogFileLocation;
String screenRecorderFileLocation;
private static final CellProcessor[] cellProcessor = new CellProcessor[] {
new ParseDate("yyyy:MM:dd"),
new ParseDate("HH:mm:ss"),
new ParseDate("SSS"),
new StrMinMax(0, 100),
new StrMinMax(0, 100),
new StrMinMax(0, 100),
new ParseInt(),
new ParseInt(),
new ParseDouble(),
new ParseDouble(),
new ParseDouble(),
new StrMinMax(0, 100),
new StrMinMax(0, 100),
};
public String[] header = {"Date", "Time", "Msec", "Application", "Window", "Message", "X", "Y", "RelDist", "TotalDist", "Rate", "Extra1", "Extra2"}; …
Run Code Online (Sandbox Code Playgroud) 我正在使用superCSV在我的代码中以csv格式写入数据.它的工作非常好,非常有效,但现在我的要求发生了变化.我需要在单个xls文件中编写多个工作表,这是非常耗时的任务.那么在supercsv中有什么方法我可以在单个csv文件中写多个工作表数据并将其发送到客户端,这样当客户端在MS-Excel中打开这个csv文件时,他可以看到多个工作表而不是我生成具有多个工作表的excel文件并将其发送到客户端.
谢谢
我有各种CSV,包含一些标准列和一些完全随机的字段:
firstname, lastname, dog_name, fav_hat, fav_color
bill,smith,fido,porkpie,blue
james,smith,rover,bowler,purple
firstname, lastname, car_type, floor_number
tom, collins, ford, 14
jim, jones, toyota, 120
Run Code Online (Sandbox Code Playgroud)
所以我试图将它们解析为Person.class bean,它包含firstname和lastname,然后我有一个名为PersonAttribute.class的第二个类来保存......还有其他什么.
这两个类的讽刺大纲:
class Person {
public String firstname;
public String lastname;
public List<PersonAttribute> attribs;
}
class PersonAttribute {
public Person p;
public String key; // header name, ex. 'car_type'
public String value; // column value, ex. 'ford'
}
Run Code Online (Sandbox Code Playgroud)
我一直在opencsv中使用CsvToBean函数:
public static List<Person> parseToBeans(File csvFile, HashMap<String, String> mapStrategy, Class beanClass) throws IOException {
CSVReader reader = null;
try {
reader …
Run Code Online (Sandbox Code Playgroud) 我编写了一个实体,其中只包含一个LocalDateTime
使用Super CSV的 CSV文件,ICsvDozerBeanWriter
并且在使用a读取它时遇到错误ICsvDozerBeanReader
.我能够成功读取和写入一个Date
对象,但LocalDateTime
无法正常工作.
我添加了super-csv-java8依赖项,写入部分似乎工作正常.
我在这个Github仓库中创建了一个小型演示应用程序来复制问题.运行main()方法,错误将输出到控制台.
这是我得到的例外:
2016-12-09 22:24:02.427 ERROR 50405 --- [ main] org.dozer.MappingProcessor : Field mapping error -->
MapId: null
Type: null
Source parent class: org.supercsv.io.dozer.CsvDozerBeanData
Source field name: columns
Source field type: class java.time.LocalDateTime
Source field value: 2016-12-09T22:24:02.226
Dest parent class: com.example.Entity
Dest field name: dateTime
Dest field type: java.time.LocalDateTime
org.dozer.MappingException: java.lang.NoSuchMethodException: java.time.LocalDateTime.<init>()
at org.dozer.util.MappingUtils.throwMappingException(MappingUtils.java:82) ~[dozer-5.4.0.jar:na]
at org.dozer.factory.ConstructionStrategies$ByConstructor.newInstance(ConstructionStrategies.java:261) ~[dozer-5.4.0.jar:na]
at org.dozer.factory.ConstructionStrategies$ByConstructor.create(ConstructionStrategies.java:245) ~[dozer-5.4.0.jar:na]
at …
Run Code Online (Sandbox Code Playgroud) 我解析CSV文件并使用supercsv创建域对象.我的域对象有一个枚举字段,例如:
public class TypeWithEnum {
private Type type;
public TypeWithEnum(Type type) {
this.type = type;
}
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
}
Run Code Online (Sandbox Code Playgroud)
我的枚举看起来像这样:
public enum Type {
CANCEL, REFUND
}
Run Code Online (Sandbox Code Playgroud)
尝试使用此CSV文件创建bean:
final String[] header = new String[]{ "type" };
ICsvBeanReader inFile = new CsvBeanReader(new FileReader(
getFilePath(this.getClass(), "learning/enums.csv")), CsvPreference.STANDARD_PREFERENCE);
final CellProcessor[] processors =
new CellProcessor[]{ TODO WHAT TO PUT HERE? };
TypeWithEnum myEnum = inFile.read(
TypeWithEnum.class, header, processors); …
Run Code Online (Sandbox Code Playgroud) 我想使用SuperCSV CellProcessor用逗号作为小数分隔符(','而不是'.')解析double.
我想将第一个元素(0,35)解析为Double
0,35;40000,45
Run Code Online (Sandbox Code Playgroud)
我尝试过类似的东西:
/** FRENCH_SYMBOLS */
private static final DecimalFormatSymbols FRENCH_SYMBOLS = new DecimalFormatSymbols(Locale.FRANCE);
DecimalFormat df = new DecimalFormat();
df.setDecimalFormatSymbols(FRENCH_SYMBOLS);
final CellProcessor[] processors = new CellProcessor[] {
new NotNull(new ParseDouble(new FmtNumber(df))),
new NotNull(new ParseBigDecimal(FRENCH_SYMBOLS)) };
Run Code Online (Sandbox Code Playgroud)
ParseBigDecimal工作正常,但parseDouble似乎不起作用,它给了我一个异常:org.supercsv.exception.SuperCsvCellProcessorException:'0,35'无法解析为Double