Я действительно верю, что совет @JoniVR будет очень полезен, и вам следует подумать об использовании разделителя для столбцов в строке.В настоящее время вы не сможете анализировать составные данные, например, по имени «Мэри Энн».Кроме того, поскольку у предоставленных вами примеров данных уже есть 4 строки, у вас должен быть POJO, который будет представлять данные, проанализированные из файла.Концептуальная выглядит так:
class MyPojo {
private String name;
private int postCode;
private String state;
private int cityId;
public MyPojo(String name, int postCode, String state, int cityId) {
this.name = name;
this.postCode = postCode;
this.state = state;
this.cityId = cityId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPostCode() {
return postCode;
}
public void setPostCode(int postCode) {
this.postCode = postCode;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public int getCityId() {
return cityId;
}
public void setCityId(int cityId) {
this.cityId = cityId;
}
@Override
public String toString() {
return "MyPojo{" +
"name='" + name + '\'' +
", postCode=" + postCode +
", state='" + state + '\'' +
", cityId=" + cityId +
'}';
}
}
Тогда вы хотели бы, чтобы ошибки встречались после проверки строк, я думаю, так что было бы неплохо подумать о каком-то классе ошибок, хранящем эти (A должным образомразработан тот, который расширяет класс исключений может быть?).Очень простой класс для этой цели:
class InsertionError {
private String message;
private int lineNumber;
public InsertionError(String message, int lineNumber) {
this.message = message;
this.lineNumber = lineNumber;
}
@Override
public String toString() {
return "Error at line " + lineNumber + " -> " + message;
}
}
И тогда само решение должно:1. Разделить линии.2. Токенизируйте столбцы для каждой строки и анализируйте / проверяйте их.3. Соберите данные столбцов в полезное представление Java.
Может быть что-то вроде:
private static final int HEADERS_COUNT = 4;
private static final int LINE_NUMBER_CURSOR = 0;
public static void main(String[] args) {
String data = "Marsha 1234 Florida 1268\n" +
"Jasmine Texas 4456\n" +
"Jane 1523 Texas 4456\n" +
"Jasmine Texas 2233 asd\n" +
"Mark 7253 Georgia 1234";
int[] lineNumber = new int[1];
List<InsertionError> errors = new ArrayList<>();
List<MyPojo> insertedPojo = Arrays.stream(data.split("\n"))
.map(x -> x.split("\\p{Blank}+"))
.map(x -> {
lineNumber[LINE_NUMBER_CURSOR]++;
if (x.length == HEADERS_COUNT) {
Integer postCode = null;
Integer cityId = null;
try {
postCode = Integer.valueOf(x[1]);
} catch (NumberFormatException ignored) {
errors.add(new InsertionError("\"" + x[1] + "\" is not a numeric value.", lineNumber[LINE_NUMBER_CURSOR]));
}
try {
cityId = Integer.valueOf(x[3]);
} catch (NumberFormatException ignored) {
errors.add(new InsertionError("\"" + x[3] + "\" is not a numeric value.", lineNumber[LINE_NUMBER_CURSOR]));
}
if (postCode != null && cityId != null) {
return new MyPojo(x[0], postCode, x[2], cityId);
}
} else {
errors.add(new InsertionError("Columns count does not match headers count.", lineNumber[LINE_NUMBER_CURSOR]));
}
return null;
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
errors.forEach(System.out::println);
System.out.println("Number of successfully inserted Pojos is " + insertedPojo.size() + ". Respectively they are: ");
insertedPojo.forEach(System.out::println);
}
, которое печатает:
Ошибка в строке 2 ->Количество столбцов не соответствует количеству заголовков.Ошибка в строке 4 -> «Техас» не является числовым значением.Ошибка в строке 4 -> «asd» не является числовым значением.Количество успешно вставленных Pojos - 3. Соответственно они:MyPojo {name = 'Marsha', postCode = 1234, штат = 'Флорида', cityId = 1268}MyPojo {name = 'Jane', postCode = 1523, штат = 'Texas', cityId = 4456}MyPojo {name = 'Mark', postCode = 7253, штат = 'Georgia', cityId = 1234}