2016-11-10 9 views
0

Цель моего кода - заменить определенное текстовое значение в моем файле .CSV на пользовательский ввод текстового поля.Объект [] не может быть преобразован в String []

У моего .CSV файла есть значения, содержащиеся по имени: hey,hi. Если я просто захочу заменить «hey», тогда я соберу вход из текстового поля и замените «hey» на «bye». Выход: bye,hi.

В моем коде, я считаю, что читаю в своем файле и записываю содержимое файла в список, разделенный запятыми.

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

Однако я не могу записать его обратно в файл, поскольку я получаю объект [] не может быть преобразован в String [] error. Таким образом, я зациклился на том, как заменить экземпляр ввода пользователя в текстовом файле.

Вот мой код:

try{ 

     //Convert user input into strings 
     String strSerial = editSerialField.getText(); 
     String strLocation = editLocationField.getText(); 

     //Read existing file 
     CSVReader reader = new CSVReader(new FileReader("test test.txt"), ','); 
     List myEntries = reader.readAll(); 

     //Iterate through my array 
     for (int i = 0; i < myEntries.size(); i++) 
     { 
      //If an entry matches the user input 
      if (myEntries.get(i).equals(strSerial)) 
      { 
       //Set the match to the user input from strLocation 
       myEntries.set(i, strLocation); 
       break; 
      } 
     } 

     //Write to existing file 
     CSVWriter writer = new CSVWriter(new FileWriter("test test.txt"), ','); 

     //Error is here********************** 
     //Write the new string with the replaced word OVER the same file 
     writer.writeNext(myEntries.toArray(new String[myEntries.size()])); 
     writer.close(); 

     }catch (IOException e) 
     { 
      System.out.println(e); 
     } 
} 

Как изменить свой код так, чтобы он пишет свои изменения в файл .CSV?

+0

Используйте generics для изменения переменной myEntries следующим образом. Список myEntries = reader.readAll(); – dammina

ответ

0

Для начала writeNext будет писать на линии за раз, поэтому вам необходимо выполнить цикл.

Во-вторых, рассмотрите возможность использования не сырого List, но с использованием дженериков.

В-третьих, это может быть чище, чтобы написать, как вы идете

и, наконец, каждая строка будет содержать массив строк

рассмотреть этот код (не проверено)

 CSVReader reader = new CSVReader(new FileReader("test test.txt"), ','); 
     List<String []> myEntries = reader.readAll(); 
     reader.close(); 

     CSVWriter writer = new CSVWriter(new FileWriter("test test.txt"), ','); 

     //Iterate through my array 
     for (String [] line : myEntries) 
     { 
      ArrayList<String> newLine = new ArrayList <String>(); 
      for (String word : line) { 
      { 
       String newVal = word.replace(strSerial, strLocation); 
       newLine.add (newVal); 
      } 
      writer.writeNext(newLine.toArray(new String[newLine.size()])); 
     } 
+0

Этот код не работает. Он стирает весь мой файл - даже если был указан пользовательский ввод. – juiceb0xk

+0

Вы закрываете писателя? 'writer.close();' –

+0

Я сейчас, и теперь он выводит пользовательский ввод в речевых меток. Он также стирает весь файл и показывает только пользовательский ввод. – juiceb0xk

0

вашу проблему/начинается с этой строки:

List myEntries = reader.readAll(); 

Я предполагаю, что вы не заметили что тип возвращаемого значения методы ReadAll() является

List<String[]> 

Если, например, ваш тестовый файл выглядит следующим образом:

hey, hi 
hallo, hello 
sth, sthelse 

После вызова ReadAll() ваш переменный myEntries будет списком строковых массивов; каждый массив, представляющий каждую строку в файл и каждая строка из этой строки в качестве элемента массива

myEntries : [hey, hi] 
      [hallo, hello] 
      [sth, sthelse] 

Имея это в виду, следующий выпуск является

if (myEntries.get(i).equals(strSerial)) 

, где вы пытаетесь сравнить String [] с строкой, которая не будет правдой. Попробуйте это следующим образом:

try{ 
     //Convert user input into strings 
     String strSerial = editSerialField.getText(); 
     String strLocation = editLocationField.getText(); 

     CSVReader reader = new CSVReader(new FileReader("test test.txt"), ','); 
     // valid but not a good practice how you declare your variable before 
     // List myEntries = reader.readAll(); // List of what?? 
     List<String[]> myEntries = reader.readAll(); 

     for (String[] row : myEntries){   // go through each array from your list representing a row in your file 
      for (int i = 0; i < row.length; i++){  //go through each element of that array 
       if (row[i].equalsIgnoreCase(strSerial)){ 
        row[i] = strLocation; 
       } 
      } 
     } 

     //add the parameter CSVWriter.NO_QUOTE_CHARACTER to prevent opencsv from writing quotes to file 
     CSVWriter writer = new CSVWriter(new FileWriter("test test.txt"), ',',CSVWriter.NO_QUOTE_CHARACTER); 
     for (String[] row : myEntries){ 
      writer.writeNext(row); 
     }   
     writer.close(); 
    }catch (IOException e){ 
     System.out.println(e); 
    } 

не очень важно, но я предпочел бы test.csv вместо test.txt в качестве имени файла до тех пор, как вы храните запятую значения там.

+0

Вы также можете использовать метод reader.readNext() для чтения вашего файла построчно – Eritrean

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