Я думаю, что ваш лучший выбор - полагаться на образец, который не меняется. Вы упомянули о том, что у вас есть номера с запятой в виде тысяч разделителей. Я вижу, что в ваших строках эти числа заключены в двойную кавычку. Исходя из следующих предположений:
- Номер заключен в двойных кавычках
- Существует только один из такого числа в каждой строке (если более одного, то найти все пары двойных кавычек и хранить их в массивов или список, и проверить, чтобы убедиться, что индекс не попадают в диапазон для каждого)
Тогда для вас сделать следующее:
- Получить первый индекс двойные кавычки, т.е. 154
- Получить второй/последний индекс двойной кавычки, т.е. 159
- Заменить все запятые \ t при условии, что индекс запятой меньше первого индекса первой двойной кавычки или индекса запятой больше последнего индекса двойной кавычки (это должно пропустить запятую числа, чтобы заменить \ т)
следующий код делает то выше для вас:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
public class CsvToTabConvertor {
public static void main(String[] args) {
File file = new File("C:\\test_java\\csvtotab.txt");
List<String> processedLines = new ArrayList<String>();
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
StringBuilder builder;
while((line=br.readLine()) != null) {
builder = new StringBuilder(line);
//find number in double quote - assuming there is only one number with double quotes
int doubleQuoteIndexStart = builder.indexOf("\"");
int doubleQuoteIndexLast = builder.lastIndexOf("\"");
//for each line, find all indexes of comma
int index = builder.indexOf(",");
//previous used to when there is consecutive comma
int prevIndex = 0;
while (index >= 0) {
if(index < doubleQuoteIndexStart || index > doubleQuoteIndexLast) {
builder.setCharAt(index, '\t');
}
//get next index of comma
index = builder.indexOf(",", index + 1);
//check for consecutive commas
if(index != -1 && (prevIndex +1) == index) {
builder.setCharAt(index, ' ');
//get next index of comma
index = builder.indexOf(",", index + 1);
}
}
//add the line to list of lines for later storage to file
processedLines.add(builder.toString());
}
//close the output stream
br.close();
//write all the lines to the file
File outFile = new File("C:\\test_java\\csvtotab_processed.txt");
PrintWriter writer = new PrintWriter(outFile);
for(int i = 0; i < processedLines.size(); i++) {
writer.println(processedLines.get(i));
}
writer.close();
} catch(Exception ex) {
//handle exception
}
}
}
Входной файл, содержащий следующие строки:
Direct - House,eBay House Advertiser,537121661,,160 x 600,eBay US Publisher,537121625,eBay.com,537224178,160x600_MyeBay_US,538146889,2015-11-18,"8,455,844",0,0,0,0.000000,USD,0.000000,0.000000,0.000000
Direct - House,eBay House Advertiser,537121661,,160 x 600,eBay US Publisher,537121625,eBay.com,537224178,160x600_Search_SLR,538146895,2015-11-18,"20,175,240",30,0,0,0.000000,USD,0.000000,0.000000,0.000000
Обработанный выходной файл выглядит следующим образом:
Direct - House eBay House Advertiser 537121661 160 x 600 eBay US Publisher 537121625 eBay.com 537224178 160x600_MyeBay_US 538146889 2015-11-18 "8,455,844" 0 0 0 0.000000 USD 0.000000 0.000000 0.000000
Direct - House eBay House Advertiser 537121661 160 x 600 eBay US Publisher 537121625 eBay.com 537224178 160x600_Search_SLR 538146895 2015-11-18 "20,175,240" 30 0 0 0.000000 USD 0.000000 0.000000 0.000000
Измените указанный выше код и логику для выполнения каких-либо дополнительных потребностей.
Итак, что такое шаблон? Вы упомянули о нескольких значениях, имеющих запятую? Являются ли эти значения только числовыми значениями? Это всего одна строка или несколько строк? – Raf
@ Raf: Я теперь обновил записи. Есть 2 записи выше. Также значениями, вызывающими проблему, являются числа. Например, «8 455 844». – user1496783