Написание файла CSV. myPackage.MyClass не может быть приведен к java.lang.CharSequence - PullRequest
1 голос
/ 30 января 2012

Мне нужно записать List<MyClass> myList в файл CSV.В частности мне нужно написать values.MyClass имеет следующую реализацию:

public class MyClass {
    private Object[] values;
//...
    @Override
    public String toString() 
      {
        String line = "";
        for (int i=0; i<this.getSize(); i++) {
            //if (this.values[i] != null) {
                line = line + this.values[i] + " ";
            //}
        }
        return line;
     }
}

Код следующий:

private void saveSolutionToCSV(List<MyClass> solution) {
    int columnSize = solution.get(0).getSize();
    try {
      FileWriter writer = new FileWriter("test.csv");
      Iterator result = solution.iterator();
      while(result.hasNext()) {
         for(int i = 0; i < columnSize; i++) {
            CharSequence element = (CharSequence)result.next(); 
            writer.append(element);
            if(i < columnSize - 1)
             writer.append(',');
         }
         writer.append('\n');
      }
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
}

И сообщение об ошибке следующее:

java.lang.ClassCastException: myPackage.MyClass cannot be cast to java.lang.CharSequence

Как решить эту проблему?Thx.

Ответы [ 4 ]

1 голос
/ 30 января 2012

Вам необходимо вызвать toString () перед приведением к CharSequence.

1 голос
/ 30 января 2012

Попробуйте:

 String element = result.next().toString(); 
 writer.append(element);
 if(i < columnSize - 1)
   writer.append(',');
0 голосов
/ 23 апреля 2012

CsvWriter.java

<code>import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Collection;

/**
 * Composes CSV data for collection of objects. Relays on theirs {@link Object#toString toString()} implementation.<br>
 * Could use memory buffer for the data or write straight to the output stream.
 * <p>
 * Example 1:
 * 
 * <pre>
 * Object[][] data = ...
 * 
 * CsvWriter writer = new CsvWriter();
 * writer.write("Column 1", "Column 2", ... "Column N");
 * for (Object[] values : data)
 *      writer.write(values);
 * ...
 * System.out.println(writer.toString());
 * 
*

* Пример 2: * *

 * Object[][] data = ...
 * 
 * CsvWriter writer = null;
 * try { 
 *      writer = new CsvWriter(new FileOutputStream(new File("data.csv")));
 *      writer.write("Column 1", "Column 2", ... "Column N");
 *      for (Object[] values : data)
 *          writer.write(values);
 * } finally {
 *      writer.close();
 * }
 * 
* * @author Михайло Адамович * / открытый класс CsvWriter реализует Closeable {public static final String NULL_MARK = "";public static final String QUOTE = "\" "; private String nullMark = NULL_MARK; private final PrintWriter pw; private ByteArrayOutputStream baos; / ** * Создает временный буфер в памяти.
* Use {@link #toString ()}после этого. Не нужно закрывать. * / public CsvWriter () {baos = new ByteArrayOutputStream (); pw = new PrintWriter (baos, true);} / ** * Не использует память для данных CSV, записывает прямо в выводпоток. Точно так же, как {@link FilterOutputStream}, но имеет дело с объектами и реле в их * реализации {@link Object # toString toString ()}.
* После этого закройте средство записи. * * @param os * выходной поток для записи данных. * / public CsvWriter (OutputStream os) {pw = new PrintWriter (os, true);} защищенный String composeRecord (Object ... values) {if (values ​​== null || values.length == 0) return ""; final StringBuffer csvRecord = new StringBuffer (); csvRecord.append (QUOTE); csvRecord.append (composeValue (values ​​[0]));; csvRecord.append (QUOTE); для (int i = 1; i

пример:

public class MyClass {
    private Object[][] data;
//...
    @Override
    public String toCsv() {
        CsvWriter writer = new CsvWriter();
        csvWriter.write("Column1", "Column2")
        for (final Object[] values : data)
            csvWriter.write(values);
        return writer.toString();
     }
}
0 голосов
/ 30 января 2012

Попробуйте вызвать метод toString () явно как

CharSequence element = (CharSequence)result.next().toString(); 
...