2015-11-26 7 views
0

Я пытаюсь преобразовать файл csv, разделенный запятыми, в отдельный раздел csv с помощью java. Однако некоторые значения внутри самого файла имеют запятые. Пожалуйста, обратитесь к приведенному ниже примеру:Преобразовать разделенный запятыми файл csv на вкладку spearated с помощью java

Direct - House,Bayer House Advertiser,537121661,,160 x 600,Bayer US Publisher,537121625,Bayer.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,Bayer House Advertiser,537121661,,160 x 600,Bayer US Publisher,537121625,Bayer.com,537224178,160x600_Search_SLR,538146895,2015-11-18,"20,175,240",30,0,0,0.000000,USD,0.000000,0.000000,0.000000 

Так может ли кто-нибудь помочь мне справиться с этими значениями?

Спасибо.

+0

Итак, что такое шаблон? Вы упомянули о нескольких значениях, имеющих запятую? Являются ли эти значения только числовыми значениями? Это всего одна строка или несколько строк? – Raf

+0

@ Raf: Я теперь обновил записи. Есть 2 записи выше. Также значениями, вызывающими проблему, являются числа. Например, «8 455 844». – user1496783

ответ

2

Я думаю, что ваш лучший выбор - полагаться на образец, который не меняется. Вы упомянули о том, что у вас есть номера с запятой в виде тысяч разделителей. Я вижу, что в ваших строках эти числа заключены в двойную кавычку. Исходя из следующих предположений:

  1. Номер заключен в двойных кавычках
  2. Существует только один из такого числа в каждой строке (если более одного, то найти все пары двойных кавычек и хранить их в массивов или список, и проверить, чтобы убедиться, что индекс не попадают в диапазон для каждого)

Тогда для вас сделать следующее:

  1. Получить первый индекс двойные кавычки, т.е. 154
  2. Получить второй/последний индекс двойной кавычки, т.е. 159
  3. Заменить все запятые \ 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 

Измените указанный выше код и логику для выполнения каких-либо дополнительных потребностей.

+0

Большое спасибо @Raf :) – user1496783

+0

@ user1496783 Добро пожаловать, если ответ помог решить вашу проблему, тогда у вас есть возможность пометить ответ как ** принятый **, вы можете прочитать больше здесь http: // stackoverflow .com/help/accepted-answer – Raf

+0

просто использовал его для моей собственной проблемы, отлично работал! @Raf cheers Я хотел заменить запятые на вкладки, а затем полные остановки запятыми, поэтому я просто скопировал/вставил код и запустил его в ту же самую главную. Первым выходом был второй вход. Не самый элегантный код, но он выполнил эту работу. –

 Смежные вопросы

  • Нет связанных вопросов^_^