Java CSVReader игнорировать запятые в двойных кавычках
У меня есть файл CSV, с которым я не могу разобраться. Я использую библиотеку opencsv. Вот как выглядят мои данные и чего я пытаюсь достичь.
RPT_PE, CLASS, RPT_MKT, PROV_CTRCT, CENTER_NM, GK_TY, MBR_NM, MBR_PID "20150801", "NULL", "33612", "00083249P PCP602", "JOE SMITH ARNP", "NULL", "FRANK", L 50004655200"
У меня проблема с именем участника ("FRANK, LUCAS E"
) разделяется на две колонки, и имя члена должно быть одним. Я снова использую opencsv и запятую в качестве разделителя. Можно ли как-то игнорировать запятые внутри двойных кавычек?
public void loadCSV(String csvFile, String tableName,
boolean truncateBeforeLoad) throws Exception {
CSVReader csvReader = null;
if (null == this.connection) {
throw new Exception("Not a valid connection.");
}
try {
csvReader = new CSVReader(new FileReader(csvFile), this.seprator);
} catch (Exception e) {
e.printStackTrace();
throw new Exception("Error occured while executing file. "
+ e.getMessage());
}
String[] headerRow = csvReader.readNext();
if (null == headerRow) {
throw new FileNotFoundException(
"No columns defined in given CSV file."
+ "Please check the CSV file format.");
}
String questionmarks = StringUtils.repeat("?,", headerRow.length);
questionmarks = (String) questionmarks.subSequence(0, questionmarks
.length() - 1);
String query = SQL_INSERT.replaceFirst(TABLE_REGEX, tableName);
System.out.println("Base Query: " + query);
String headerRowMod = Arrays.toString(headerRow).replaceAll(", ]", "]");
String[] strArray = headerRowMod.split(",");
query = query
.replaceFirst(KEYS_REGEX, StringUtils.join(strArray, ","));
System.out.println("Add Headers: " + query);
query = query.replaceFirst(VALUES_REGEX, questionmarks);
System.out.println("Add questionmarks: " + query);
String[] nextLine;
Connection con = null;
PreparedStatement ps = null;
try {
con = this.connection;
con.setAutoCommit(false);
ps = con.prepareStatement(query);
if (truncateBeforeLoad) {
//delete data from table before loading csv
con.createStatement().execute("DELETE FROM " + tableName);
}
final int batchSize = 1000;
int count = 0;
Date date = null;
while ((nextLine = csvReader.readNext()) != null) {
System.out.println("Next Line: " + Arrays.toString(nextLine));
if (null != nextLine) {
int index = 1;
for (String string : nextLine) {
date = DateUtil.convertToDate(string);
if (null != date) {
ps.setDate(index++, new java.sql.Date(date
.getTime()));
} else {
ps.setString(index++, string);
}
}
ps.addBatch();
}
if (++count % batchSize == 0) {
ps.executeBatch();
}
}
ps.executeBatch(); // insert remaining records
con.commit();
} catch (SQLException | IOException e) {
con.rollback();
e.printStackTrace();
throw new Exception(
"Error occured while loading data from file to database."
+ e.getMessage());
} finally {
if (null != ps) {
ps.close();
}
if (null != con) {
con.close();
}
csvReader.close();
}
}
public char getSeprator() {
return seprator;
}
public void setSeprator(char seprator) {
this.seprator = seprator;
}
public char getQuoteChar() {
return quoteChar;
}
public void setQuoteChar(char quoteChar) {
this.quoteChar = quoteChar;
}
}
4 ответа
Вы пробовали следующее?
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), ',');
Я написал следующую программу, и она работает для меня, я получил следующий результат:
[20150801] [NULL] [33612] [00083249P PCP602] [ДЖО СМИТ АРНП] [NULL] [ФРАНК, ЛУКАС E] [50004655200]
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import au.com.bytecode.opencsv.CSVReader;
public class CVSTest {
/**
* @param args
*/
public static void main(String[] args) {
CSVReader reader = null;
try {
reader = new CSVReader(new FileReader(
"C:/Work/Dev/Projects/Pure_Test/Test/src/cvs"), ',');
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String[] nextLine;
try {
while ((nextLine = reader.readNext()) != null) {
// nextLine[] is an array of values from the line
System.out.println("[" + nextLine[0] + "] [" + nextLine[1]
+ "] [" + nextLine[2] + "] [" + nextLine[3] + "] ["
+ nextLine[4] + "] [" + nextLine[5] + "] ["
+ nextLine[6] + "] [" + nextLine[7] + "]");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Согласно документации, вы можете указать собственный конструктор и символы кавычек в конструкторе, который должен с этим справиться:
CSVReader(Reader reader, char separator, char quotechar)
Создайте свой читатель с, как разделитель и "как кавычка.
Ваш случай должен быть обработан из коробки без специальной настройки требуется.
Если вы не можете заставить его работать, просто переключитесь на uniVocity-парсеры, чтобы сделать это за вас - это в два раза быстрее по сравнению с OpenCSV, требует гораздо меньше кода и содержит множество функций.
CsvParserSettings settings = new CsvParserSettings(); // you have many configuration options here - check the tutorial.
CsvParser parser = new CsvParser(settings);
List<String[]> allRows = parser.parseAll(new FileReader(new File("C:/Work/Dev/Projects/Pure_Test/Test/src/cvs")));
Раскрытие: я являюсь автором этой библиотеки. Это с открытым исходным кодом и бесплатно (лицензия Apache V2.0).
Просто загрузить CSV в виде таблицы SQL в HSQLDB, а затем выбрать строки из таблицы для вставки в другую базу данных. HSQLDB обрабатывает запятые внутри кавычек. Вы должны определить свой текстовый источник как "цитируемый". Видеть это: