Лучшим способом сделать это было бы чтение файла по строкам и проверка правильности формата строки. Если это правильно, добавьте новый объект в список с данными в строке, иначе напишите сообщение об ошибке и продолжите.
Вы можете прочитать ваш файл, используя BufferedReader
. Они могут читать построчно, выполнив следующие действия:
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
// do something with the line here
}
br.close();
Теперь, когда у вас есть строки, вы должны убедиться, что они находятся в правильном формате. Простым методом для этого является разделение строки на запятую (так как это файл csv) и проверьте, что в массиве имеется как минимум 3 элемента. Вы можете сделать это с помощью метода String.split(regex)
.
String[] bookDetails = line.split(",");
Это заполнило бы массив полями из вашего файла. Например, если первая строка была one,two,three
, тогда массив будет ["one","two","three"]
.
Теперь у вас есть значения из строки, но вы должны убедиться, что она в правильном формате. Поскольку в вашем сообщении указано, что у него должно быть 3 поля, мы можем проверить это, проверив длину массива, который мы получили выше. Если длина меньше 3, мы должны вывести некоторое сообщение об ошибке и пропустить эту строку.
if(bookDetails.length<3){ //title,author,year
System.err.println("Some error message here"); // output error msg
continue; // skip this line as the format is corrupted
}
Наконец, поскольку мы прочитали и подтвердили, что необходимая информация есть и находится в допустимом формате. Мы можем создать новый объект и добавить его в список.Мы будем использовать обертку Integer
, встроенную в Java
, для анализа года в примитиве int
типа для конструктора классов Book
. Integer
имеет функцию Integer.parseInt(String s)
, которая будет анализировать String
на значение int
.
list.add(new Book(bookDetails[0], bookDetails[1], Integer.parseInt(bookDetails[2])));
Надеюсь, это поможет вам и ответит на ваш вопрос. Полный метод, что мы сделали может быть следующим:
public static List<Book> getList(String file) {
List<Book> list = new ArrayList<Book>();
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
String[] bookDetails = line.split(",");
if (bookDetails.length < 3) { // title,author,year
System.err.println("Some error message here");
continue;
}
list.add(new Book(bookDetails[0], bookDetails[1], Integer.parseInt(bookDetails[2])));
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
И если вы хотите, чтобы проверить это, метод main
можно сделать с помощью следующего кода (это, как я тестировал).
public static void main(String[] args) {
String file = "books.csv";
List<Book> books = getList(file);
for(Book b : books){
System.out.println(b);
}
}
Чтобы проверить это, убедитесь, что у вас есть файл (шахта «books.csv») в корневом каталоге вашего Java
проекта. Шахта выглядела как:
bob,jones,1993
bob,dillon,1994
bad,format
good,format,1995
another,good,1992
bad,format2
good,good,1997
И с указанным выше основным методом, функцией GetList, и файлом, мой код генератор следующего выходные (примечание: сообщения об ошибках были в красном цвете для потока Std.err, так не показать цвета):
Some error message here
Some error message here
[title=bob, author=jones, years=1993]
[title=bob, author=dillon, years=1994]
[title=good, author=format, years=1995]
[title=another, author=good, years=1992]
[title=good, author=good, years=1997]
Не стесняйтесь задавать вопросы, если вас путают на любой его части. Выведенный результат относится к методу toString()
, который я написал в классе Book
, который использовался для проверки кода в моем ответе.
CSV-файл - это всего лишь текстовый файл. Вы можете использовать синтаксический анализатор CSV, или вы можете просто прочитать в каждой строке из файла, использовать 'String # split', чтобы разбить каждую часть, выполнить валидацию для заказа, создать из них объект« Book »(если они pass) и добавьте его в 'ArrayList'. Есть МНОГО примеров каждой части этого на этом сайте и просто выполняет поиск Google. – Ascalonian
[Здесь] (http://stackoverflow.com/a/22074145/3315914) пример чтения файла по строкам. Вы можете создать конструктор для создания новой книги из строки, используя 'String.split (", ")'. – rpax
Следующий вопрос ... будет ли файл содержать цитируемые строки, которые могут содержать запятую? Например, '' Awesome Book, The ''? – Ascalonian