Java - Ошибка чтения из файла CSV - PullRequest
0 голосов
/ 05 мая 2018

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

enter image description here

Теперь я думаю, что знаю, почему я получаю ошибку, но я могу найти способ ее исправить. Я пишу в файл со следующим кодом:

public void writeToFile(AbstractAccount account)
{
    StringBuilder sb = new StringBuilder();

    sb.append(account.getFirstname() + ",");
    sb.append(account.getLastname() + ",");
    sb.append(account.getID() + ",");
    sb.append(account.getPhonenum() + ",");
    sb.append(account.getUsername() + ",");
    sb.append(account.getPassword() + ",");
    sb.append(account.getAccounttype());

    FileWriter fw = null;
    try
    {
        fw = new FileWriter("login.csv", true);
        fw.append(System.lineSeparator() + sb.toString());
        fw.close();
    } catch (IOException e)
    {
        e.printStackTrace();
    }
}

Проблема в том, что внутри CSV-файла выглядит так:

John,Doe,A1,0123456789,johnd,password1,Admin
Jane,Doe,A2,1234567890,janed,password2,CourseCoordinator
John,Smith,A3,2345678901,johns,password3,Approver
Jane,Smith,A4,356789012,johns,password4,CasualStaff
Test, Test, Test, Test, test, test, Admin

Но когда я копирую его где-то, как в текстовый редактор переполнения стека, я вижу, что фактический формат таков:

John,Doe,A1,0123456789,johnd,password1,Admin
Jane,Doe,A2,1234567890,janed,password2,CourseCoordinator
John,Smith,A3,2345678901,johns,password3,Approver
Jane,Smith,A4,356789012,johns,password4,CasualStaff

Test, Test, Test, Test, test, test, Admin

Поэтому, когда я читаю из файла, используя этот код:

public ArrayList<AbstractAccount> readFromFile(String filename)
{
    BufferedReader br = null;

    String line = "";

    try
    {
        br = new BufferedReader(new FileReader(filename));
        while ((line = br.readLine()) != null)
        {
            // use comma as separator
            String[] attributes = line.split(",");
            accounts.add(CreateAccount(attributes));
        }

    } catch (FileNotFoundException e)
    {
        e.printStackTrace();
    } catch (IOException e)
    {
        e.printStackTrace();
    }
    return accounts;
}

Я получаю ту ошибку, о которой упоминал ранее. Я пробовал несколько способов написать новую строку, но я не могу найти тот, который не дает мне эту пустую строку. У кого-нибудь есть идеи?

РЕДАКТИРОВАТЬ: код для создания учетной записи

public AbstractAccount CreateAccount(String[] data)
{
    String firstname = data[0];
    String lastname = data[1];
    String id = data[2];
    String phonenum = data[3];
    String username = data[4];
    String password = data[5];
    String accounttype = data[6];

    if (accounttype.equals("Admin"))
        return new AdminModel(firstname, lastname, id, phonenum, username, password);
    else if (accounttype.equals("CourseCoordinator"))
        return new CourseCoordinatorModel(firstname, lastname, id, phonenum, username, password);
    else if (accounttype.equals("Approver"))
        return new ApproverModel(firstname, lastname, id, phonenum, username, password);
    else if (accounttype.equals("CasualStaff"))
        return new CasualStaffModel(firstname, lastname, id, phonenum, username, password);
    else
        return null;
}

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Вы получаете исключение, потому что данные, которые вы отправляете методу CreateAccount (который должен начинаться со строчной буквы), не соответствуют ожидаемому размеру.

Например, если вы отправили массив String длины = 3 и пытаетесь получить пароль с 5-го места в массиве, вы получите ArrayIndexOutOfBoundsException.

Скорее всего, из-за логики синтаксического анализа CSV вы отправляете пустой массив в метод CreateAccount.

Вы можете отредактировать свой код CreateAccount, чтобы он выглядел следующим образом:

public AbstractAccount CreateAccount(String[] data)
{
    if(data == null || data.length != 7){

        // received data doesn't contain all the expected fields...
        // maybe check the data before sending it to this method?

        return null;
    }


    String firstname = data[0];
    String lastname = data[1];
    String id = data[2];
    String phonenum = data[3];
    String username = data[4];
    String password = data[5];
    String accounttype = data[6];

    if (accounttype.equals("Admin"))
        return new AdminModel(firstname, lastname, id, phonenum, username, password);
    else if (accounttype.equals("CourseCoordinator"))
        return new CourseCoordinatorModel(firstname, lastname, id, phonenum, username, password);
    else if (accounttype.equals("Approver"))
        return new ApproverModel(firstname, lastname, id, phonenum, username, password);
    else if (accounttype.equals("CasualStaff"))
        return new CasualStaffModel(firstname, lastname, id, phonenum, username, password);
    else
        return null;
}

Надеюсь, это поможет, а также я предлагаю вам изучить метод отладки в IDE, которую вы используете. Это очень поможет вам с кодированием!

0 голосов
/ 05 мая 2018

Не анализировать вручную использование CSV OpenCSV , которое является библиотекой с открытым исходным кодом для анализа CSV

...