2015-02-17 3 views
0

Я работаю с файлами JTable и CSV, дело в том, что мне нужно сохранить данные, вставленные в таблицу, а затем снова открыть, если пользователь должен внести некоторые изменения. Пока я могу сохранять и загружать CSV-файл, созданный из таблицы, о которой я говорил, но объект BufferedWriter добавляет запятую в конце каждой строки, что вызывает новый пустой столбец при загрузке существующего файла CSV.Как избежать/удалить запись последней запятой в строке?

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

if(jTable1.getModel()==this.m){ 
      File file = new File(this.tfSelectedSpreadsheet.getText().toString()); 
      if(file.exists() && !file.isDirectory()){ 
       file.delete(); 
      } 
      BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(this.tfSelectedSpreadsheet.getText().toString()),"UTF-8")); 
      for(int i=0; i<jTable1.getColumnCount();i++){ 
       bfw.append(jTable1.getColumnName(i)); 
       if(i<jTable1.getColumnCount()) bfw.append(","); 
       else bfw.newLine(); 
      } 
      bfw.newLine(); 
      for(int i=0;i<jTable1.getRowCount();i++){ 
       for(int j=0;j<jTable1.getColumnCount();j++){ 
        bfw.append((String)jTable1.getValueAt(i,j)); 
        if(j<jTable1.getColumnCount()) bfw.append(","); 
        bfw.newLine(); 
       } 
       bfw.newLine(); 
      } 
      bfw.close(); 
     } 

И это как файл CSV, порожденный этим кодом выглядит следующим образом:

Link,Long,Lat,CRS, 
R011,120.1126,-33.5422,GDA94, 
R014,120.1126,-33.5422,GDA94, 
R019,120.1126,-33.5422,GDA94, 
R011,120.1126,-33.5422,GDA94, 
R011,120.1126,-33.5422,GDA94, 
R011,120.1126,-33.5422,GDA94, 
R015,120.1126,-33.5422,GDA94, 
R014,120.1126,-33.5422,GDA94, 
WANDA,25.12.1990,-37.0991,GDA90, 

Что я могу сделать, чтобы исправить это «запятая» проблема?

+0

Это распространенная проблема, и я не знаю «умного» решения. Вы должны вставить тест где-нибудь в цикле (или развернуть цикл на одну итерацию). –

ответ

3
if(i<jTable1.getColumnCount()) bfw.append(","); 

i всегда будет меньше jTable1.getColumnCount(), помните, Java индексируется 0, поэтому количество столбцов перейти от 0-jTable1.getColumnCount() - 1

Попробуйте использовать что-то больше похоже ...

if(i< == Table1.getColumnCount() - 1) bfw.append(","); 

... вместо

+0

Вы имеете в виду 'j' ... – shmosel

+0

@shmosel На основе кода примера я его украл, это было' i', это написание заголовков столбцов, но да , это применимо ко всем местам, где OP проверяет 'getColumnCount' – MadProgrammer

+0

Неплохо, я смотрел на второй цикл. – shmosel

4

Я всегда добавить запятую перед элементом, если индекс не является 0.

BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(this.tfSelectedSpreadsheet.getText().toString()),"UTF-8")); 
for(int i=0; i<jTable1.getColumnCount();i++){ 
    if (i > 0) { 
     bfw.append(","); 
    } 
    bfw.append(jTable1.getColumnName(i)); 
} 
bfw.newLine(); 
9

Поскольку Java 8 вы можете использовать StringJoiner:

StringJoiner joiner = new StringJoiner(","); 
joiner.add("First"); 
joiner.add("Second"); 

String row = joiner.toString(); // produces "First,Second" 

Вы можете даже определить префикс и суффикс:

StringJoiner joiner = new StringJoiner(",", "[", "]"); 
joiner.add("First"); 
joiner.add("Second"); 

String row = joiner.toString(); // produces "[First,Second]" 

Если ваши данные уже доступны в качестве коллекции (или что-то еще, что c производят Stream), вы также можете использовать новый поток API вместо того, чтобы писать еще один цикл:

List<String> data = ... 
String row = data.stream().collect(Collectors.joining(",")); 
+1

Научите меня чему-то новому +1 – MadProgrammer

+0

В наши дни я не занимаюсь большим количеством Java, но это удобная Java 8 вещь, которую нужно знать. Благодаря! – John3136

+0

Иногда чтение JavaDoc похоже на поиск сокровищ ...;) – isnot2bad

0

спасибо MadProgrammer Я решил проблему, используя этот код, я надеюсь, что он может помочь кому-то там.

if(jTable1.getModel()==this.m){ 
      File file = new File(this.tfSelectedSpreadsheet.getText().toString()); 
      if(file.exists() && !file.isDirectory()){ 
       file.delete(); 
      } 
      BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(this.tfSelectedSpreadsheet.getText().toString()),"UTF-8")); 
      for(int i=0; i<jTable1.getColumnCount();i++){ 
       bfw.append(jTable1.getColumnName(i)); 
       if(i<jTable1.getColumnCount()-1) bfw.append(",");//Here i changed the condition 
       else bfw.newLine(); 
      } 
      for(int i=0;i<jTable1.getRowCount();i++){ 
       for(int j=0;j<jTable1.getColumnCount();j++){ 
        bfw.append((String)jTable1.getValueAt(i,j)); 
        if(j<jTable1.getColumnCount()-1) bfw.append(",");//Here i changed the condition 
        else bfw.newLine(); 
       } 
      } 
      bfw.close(); 
     } 
Смежные вопросы