2013-07-19 2 views
4

Я написал класс Java для создания CSV файла:Письменное CSV файл записывает только одну ячейку в строке

public class CSVGenerator { 

    private static String REFERRAL_HEADER = "Position,Mail,Invitations,Qualified invitations"; 
    private static String TOPS_HEADER = "Position,Mail,Number of conferences,Number of new contacts, Average conf duration"; 

    public static String generate(String source, JsonNode root) throws IOException { 
     String result = ""; 
     CSVWriter writer = new CSVWriter(new FileWriter(source+".csv")); 
     if (source.compareTo("referral") == 0) 
      result = REFERRAL_HEADER; 
     else if (source.compareTo("tops") == 0) 
      result = TOPS_HEADER; 
     writer.writeNext(result.split(",")); 
     Iterator<JsonNode> it = root.getElements(); 
     while (it.hasNext()) { 
      Iterator<JsonNode> it2 = it.next().getElements(); 
      result = ""; 
      while (it2.hasNext()) 
      { 
       result += it2.next().asText(); 
       if (it2.hasNext()) 
        result += ","; 
      } 
      writer.writeNext(result.split(",")); 
     } 
     writer.close(); 
     return result; 
    } 
} 

Результирующий файл не очень хорошо отформатированные. Там только одна ячейка построчно, содержащий все ячейки и разделяющей запятой, как это:

header1,header2,header3 
1,support,test 
2,alpha,gamma 

Что я делаю неправильно?

EDIT:

Чтобы быть более точным на выходе

У меня есть: "HEADER1, HEADER2, header3", "", ""

Я хочу: «header1 "," header2 "," header3 "

Вот мой вывод. Каждая строка в одной уникальной ячейке.

""Position","Mail","Invitations","Qualified invitations"" 
    ""1","xxxxx.com","129","23"" 
    ""2","xxxx.com","54","8"" 
    ""3","xxxx.com","197","5"" 
    ""4","xxxx","13","5"" 
    ""5","xxxx","8","4"" 
    ""6","xxxx.com","4","4"" 
    ""7","xxx.com","31","3"" 
    ""8","xxx.com","30","3"" 
    ""9","xxx.com","18","3"" 
    ""10","xxx.com","13","3"" 
+0

Что не так с этим выходом? выглядит хорошо для меня –

+0

Я не буду размещать электронные письма и прочее здесь. Проблема в том, что для одной строки есть одна ячейка. Это похоже на разделение запятой, не работает. Поэтому у меня есть: «header1, header2, header3», «», «» вместо «header1», «header2», «header3» – EoiFirst

ответ

0

Возможно, это было бы лучше. Ура!

result += \"+data.asText()+\"; 
0

Вы пытались помещать кавычки вокруг атрибута результата;

result += "\""+data.asText()+"\""; 

Принимая во внимание, что я не знаком с объектом jsondata.

Также вы должны писать каждую строчку, а не добавлять все в конце.

И да, посмотрите встроенный CSVReader и CSVWriter.

+0

Я следил за вашими советами, таким же результатом. – EoiFirst

+0

Хорошо, попробуйте записать его на консоль и посмотреть, что на самом деле генерирует (переменная результата), можете ли вы разместить это здесь ... – WattoWatto

+0

Хорошо, как вы уже заметили, сгенерированные данные перепутаны – WattoWatto

0

Попробуйте добавить кавычки вокруг полей заголовка:

private static String REFERRAL_HEADER = "\"Position\",\"Mail\",\"Invitations\",\"Qualified invitations\"\n"; 
private static String TOPS_HEADER = "\"Position\",\"Mail\",\"Number of conferences\",\"Number of new contacts\", \"Average conf duration\"\n"; 
+0

Я пробовал, так как я использую CSVWriter, это просто приводит к «позиции», потому что CSVWriter уже ставил кавычки – EoiFirst

0

Я попробовал подмножество кода в заводной оболочки, и я получил правильные результаты:

groovy:000> string = new java.io.StringWriter() 
===> 
csv = new CSVWriter(string) 
===> au.com.bytecode.[email protected] 
groovy:000> csv.writeNext(REFERRAL_HEADER.split(",")) 
===> null 
groovy:000> string.toString() 
===> "Position","Mail","Invitations","Qualified invitations" 

Вы можете попробовать использовать commons-csv вместо что CSVWriter. Эта библиотека немного напуганна, потому что она адаптирована к базам данных.

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