Я пишу приложение Java для экспорта данных от Oracle до файла CSV
К сожалению, содержание данных может довольно хитрый. Все еще запятая является deliminator, но некоторые данные по строке могли быть похожими на это:
ИДЕНТИФИКАТОР FN LN КОММЕНТАРИЙ ВОЗРАСТА
123, John, Smith, 39 лет, я сказал "Эй, я 5'10"."
таким образом, это - одна из строки на comment
столбец:
Я сказал "Эй, я 5'10"."
Никакое ребячество, я должен показать выше комментария без компромисса в Excel или открытом офисе из файла CSV, сгенерированного Java, и конечно не могу испортить другую регулярную ситуацию с выходом (т.е. регулярные двойные кавычки и регулярную запятую в кортеже). Я знаю, что регулярное выражение мощно, но как мы можем достигнуть цели с такой сложной ситуацией?
Существует несколько библиотек. Вот два примера:
<час> Apache Commons включает специальный класс, чтобы выйти или не выйти из строк (CSV, EcmaScript, HTML, Java, Json, XML): org.apache.commons.lang3.StringEscapeUtils
.
Escape к НеEscape CSV
String escaped = StringEscapeUtils
.escapeCsv("I said \"Hey, I am 5'10\".\""); // I said "Hey, I am 5'10"."
System.out.println(escaped); // "I said ""Hey, I am 5'10""."""
от CSV
String unescaped = StringEscapeUtils
.unescapeCsv("\"I said \"\"Hey, I am 5'10\"\".\"\"\""); // "I said ""Hey, I am 5'10""."""
System.out.println(unescaped); // I said "Hey, I am 5'10"."
* можно загрузить его от [1 114] здесь .
<час>, Если Вы используете OpenCSV, Вы не должны будете волноваться о Escape или неEscape, только для записи или считать содержание.
файл Записи:
FileOutputStream fos = new FileOutputStream("awesomefile.csv");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
CSVWriter writer = new CSVWriter(osw);
...
String[] row = {
"123",
"John",
"Smith",
"39",
"I said \"Hey, I am 5'10\".\""
};
writer.writeNext(row);
...
writer.close();
osw.close();
os.close();
файл Чтения:
FileInputStream fis = new FileInputStream("awesomefile.csv");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
CSVReader reader = new CSVReader(isr);
for (String[] row; (row = reader.readNext()) != null;) {
System.out.println(Arrays.toString(row));
}
reader.close();
isr.close();
fis.close();
* можно загрузить его от [1 115] здесь .
Excel должен смочь обработать ту же самую ситуацию.
Помещенный те вещи в Excel, сохраните их как CSV и исследуйте файл с текстовым редактором. Затем Вы будете знать правила, Excel относится к этим ситуациям.
Заставляют Java произвести тот же вывод.
форматы, используемые Excel, публикуются, между прочим...
Редактирование **** 1: **** Здесь - то, что Excel делает
Редактирование **** 2: Примечание ****, что php's fputcsv
делает ту же точную вещь как Excel, если Вы используете "в качестве корпуса.
rdeslonde@mydomain.com
Richard
"This is what I think"
преобразовывается в это:
Email,Fname,Quoted
rdeslonde@mydomain.com,Richard,"""This is what I think"""
И благодаря Tony и благодаря Paul для быстрой обратной связи, его очень полезного. Я на самом деле выясняю решение через POJO.Вот:
if (cell_value.indexOf("\"") != -1 || cell_value.indexOf(",") != -1) {
cell_value = cell_value.replaceAll("\"", "\"\"");
row.append("\"");
row.append(cell_value);
row.append("\"");
} else {
row.append(cell_value);
}
короче говоря, если существует специальный символ как запятая или двойная кавычка в строке в стороне ячейка, то сначала выходят из двойной кавычки ("\""
) путем добавления дополнительной двойной кавычки (как "\"\""
), то помещенный все это в двойную кавычку (как "\""+theWholeThing+"\""
)
Вы могли также посмотреть на то, как Python пишет совместимый с Excel csv
файлы.
я полагаю, что значение по умолчанию для Excel должно удвоиться для литеральных символов кавычки - то есть, литеральные кавычки "
записаны как ""
.
"cell one","cell "" two","cell "" ,three"
Сохраняют это к файлу CSV и видят результаты, таким образом, двойная кавычка используется для выхода из себя
, Важное Примечание
"cell one","cell "" two", "cell "" ,three"
даст Вам другой результат, потому что существует пространство после запятой, и это будут рассматривать как"
Если Вы используете CSVWriter. Проверьте, что у Вас нет опции
.withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
, Когда я удалил ее, запятая показывала как ожидалось и не рассматривала ее как новый столбец
String stringWithQuates = "\""+ "your,comma,separated,string" + "\"";
это сохранит запятую в файле CSV