2015-08-25 1 views
-5

У меня есть этот java-метод для создания файла csv на основе базы данных mysql. Файл создается правильно, но проблема в том, что в конце таблицы добавлена ​​пустая строка. Я пытался избежать этого, включая предложение if else, но я не смог его исправить. Помогите!Почему этот метод создает одну последнюю пустую строку в файле csv?

На самом деле я работаю с JavaFX, но это ошибка Java так ...

Это метод код фиксированной (проблема, видимо, из-за PHPMyAdmin, когда я пытаюсь импортировать файл CSV добавляет пустая строка в конце):

public void csv(String tabla) throws IOException{ 
    try{ 
     DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss"); 
     java.util.Date fecha=new java.util.Date(); 
     String workingDir = System.getProperty("user.dir"); 
     String filename= workingDir + "/" + dateFormat.format(fecha) + ".csv"; 
     File file= new File(filename); 
     FileWriter writer=new FileWriter(file); 
     writer.append("fecha"); 
     writer.append(','); 
     writer.append("hora"); 
     writer.append(','); 
     writer.append("fechatotal"); 
     writer.append(','); 
     writer.append("temperatura"); 
     writer.append(','); 
     writer.append("humedad"); 
     writer.append(','); 
     writer.append("luminosidad"); 
     ResultSet resultado = st.executeQuery("SELECT * FROM "+tabla+" ORDER BY fechatotal DESC"); 
     while(resultado.next()){ 
      writer.append('\n'); 
      writer.append(resultado.getDate("fecha").toString()); 
      writer.append(','); 
      writer.append(resultado.getTime("hora").toString()); 
      writer.append(','); 
      writer.append(resultado.getTimestamp("fechatotal").toString()); 
      writer.append(','); 
      writer.append(Double.toString(resultado.getDouble("temperatura"))); 
      writer.append(','); 
      writer.append(Double.toString(resultado.getDouble("humedad"))); 
      writer.append(','); 
      writer.append(Double.toString(resultado.getDouble("luminosidad"))); 
     } 
      writer.close(); 
     }catch(SQLException e){ 
      e.printStackTrace(); 
      Alert alert = new Alert(Alert.AlertType.ERROR); 
     alert.setTitle("Error"); 
     alert.setHeaderText("Error(CSV)"); 
     alert.setContentText("Uuuuups, ha ocurrido un error!"); 
     alert.showAndWait(); 
     } 
    } 
+0

@khelwood Я только что прошел и улучшили это немного ... – Edd

+0

отступов это то, что кто-то редактировал свой вопрос и фиксировано. – khelwood

+0

Вы можете использовать метод '' isLast() '] (http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#isLast()) вместо того, чтобы идти вперед, а затем назад , это может сделать ваш код более читаемым – Bibz

ответ

1

!! Этот ответ для кода в исходном вопросе !!

Пожалуйста, не делайте этого next()/previous() сочетание. Очень плохой рисунок. Например, вы выводите значение luminosidad значения следующей строки, за исключением последней строки.

Вы уже находитесь на правильном пути со строкой заголовка, не добавляя новую строку при построении строки заголовка. Продолжайте этот шаблон с строками данных, и в этом случае все строки данных должны start с символом новой строки.

Примечание: Поскольку вы не буферизируете своего писателя, конкатенация строк намного лучше. И код намного легче читать.

String sql = "SELECT *" + 
       " FROM " + tabla + 
      " ORDER BY fechatotal DESC"; 
try (FileWriter writer = new FileWriter(file)) { 
    writer.write("fecha" + 
       ",hora" + 
       ",fechatotal" + 
       ",temperatura" + 
       ",humedad" + 
       ",luminosidad"); 
    try (ResultSet resultado = st.executeQuery(sql)) { 
     writer.write("\n" + resultado.getDate("fecha") + 
         "," + resultado.getTime("hora") + 
         "," + resultado.getTimestamp("fechatotal") + 
         "," + resultado.getDouble("temperatura") + 
         "," + resultado.getDouble("humedad") + 
         "," + resultado.getDouble("luminosidad")); 
    } 
} 
+0

Вы правы с предыдущим() и следующим() шаблоном, это было только для тестирования. Но, к сожалению, ваш код по-прежнему добавляет пустую строку в конец :( – brapifra

+0

. Как она добавляет дополнительную строку? * Только * новая строка, написанная, сразу же следует текстом (дата 'fecha'), поэтому ** просто не может быть пустым. – Andreas

+0

EDIT: Очевидно, ваш код был хорошим, и он работает, я открываю файл csv с помощью Google Drive и показывает правильные строки, но когда я импортирую его в базу данных phpmyadmin, он добавляет последний пустой строка, поэтому проблема не в коде. Спасибо, в любом случае, я буду использовать ваш более короткий и не больший для глаз код :) – brapifra

0

Потому что если код в этом состоянии ударил по последней линии, она оставляет висит NEW_LINE.

if(resultado.next()){ 
    writer.append(Double.toString(resultado.getDouble("luminosidad"))); 
    writer.append('\n'); //appends a blank row when hit 
} 
Смежные вопросы