Как получить данные из текстового файла блокнота и создать коллекцию объектов Java? - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть файл блокнота, который содержит данные клиентов, в каждой строке есть новый клиент:

Все, что я хочу получить данные из файла блокнота (как показано ниже) исохранить каждого клиента в объекте java и сохранить каждый объект в списке клиентов.

Print_Sequence|Indication|SP/N-SP    |Bill_Type  |Region|Cluster
00001         |Ordinary  |           |Notice Bill|      | C10
00002         |Ordinary  |           |Notice Bill|      | C20
00003         |Ordinary  |           |Notice Bill|      | C30

Я получил данные из файла в виде строковой переменной:

String details = "";
KE_Globals.dataFile = fileChooser.getSelectedFile().getAbsoluteFile();
Scanner input = new Scanner(KE_Globals.dataFile);

while (input.hasNextLine()) {
    details += input.nextLine()+System.getProperty("line.separator");
}

Теперь яхотите преобразовать данные в этот класс Java: Клиент :

public class Customer {

private String Print_Sequence = null;
private String Indication = null;
private String SPN_SP = null;
private String Bill_Type = null;
private String Region = null;
private String Cluster = null;

public Customer(String print_Sequence, String indication, String sPN_SP, String bill_Type, String region, String cluster) {
    Print_Sequence = print_Sequence;
    Indication = indication;
    SPN_SP = sPN_SP;
    Bill_Type = bill_Type;
    Region = region;
    Cluster = cluster;
}

public String getPrint_Sequence() {
    return Print_Sequence;
}

public void setPrint_Sequence(String print_Sequence) {
    Print_Sequence = print_Sequence;
}

public String getIndication() {
    return Indication;
}

public void setIndication(String indication) {
    Indication = indication;
}

public String getSPN_SP() {
    return SPN_SP;
}

public void setSPN_SP(String sPN_SP) {
    SPN_SP = sPN_SP;
}

public String getBill_Type() {
    return Bill_Type;
}

public void setBill_Type(String bill_Type) {
    Bill_Type = bill_Type;
}

public String getRegion() {
    return Region;
}

public void setRegion(String region) {
    Region = region;
}

public String getCluster() {
    return Cluster;
}

public void setCluster(String cluster) {
    Cluster = cluster;
}

}

Может кто-нибудь сказать, пожалуйста, как мне это сделать?как:

List<Customer> customers = new ArrayList<Customer>();
Customer c = new Customer();
c.setProperties....

customers.add( c );

Спасибо.

Ответы [ 5 ]

0 голосов
/ 27 декабря 2018

Вот способ получить данные клиента из текстового файла и заполнить его коллекцией List:

import java.util.*;
import java.io.*;
import java.nio.file.*;

public class CustomerExtraction {

    public static void main(String [] args)
            throws IOException {

        Path file = Paths.get("customer_data.txt");
        List<String> lines = Files.readAllLines(file);
        List<Customer> customers = new ArrayList<>();

        for (int i = 1; i < lines.size(); i++) {
            String [] fields = lines.get(i).split("\\|");
            Customer cust = new Customer(fields[0].trim(), fields[1].trim(), fields[2].trim(), fields[3].trim(), fields[4].trim(), fields[5].trim());
            System.out.println(cust); // print to console for verification
            customers.add(cust);
        }
    }
}

class Customer {

    private String printSequence;
    private String indication;
    private String spnSp;
    private String billType;
    private String region;
    private String cluster;

    public Customer(String printSequence, String indication, String spnSp, String billType, String region, String cluster) {
        this.printSequence = printSequence;
        this.indication = indication;
        this.spnSp = spnSp;
        this.billType = billType;
        this.region = region;
        this.cluster = cluster;
    }

    // get and set methods as required here ...

    @Override
    public String toString() {
        return String.join(", ", printSequence, indication, spnSp, billType, region, cluster);
    }
}


Примечания о коде в CustomerExtraction.java:

Следующий оператор читает входной текстовый файл данных клиента и сохраняет его в коллекции List<String>.Каждая строка в файле является элементом в списке (например: «00001 | Обычный | | Notice Bill | | C10»).

List<String> lines = Files.readAllLines(file);

Это повторяет все строки в списке (исключая первую строку, что является заголовками столбцов).

for (int i = 1; i < lines.size(); i++) {

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

String [] fields = lines.get(i).split("\\|");

В последующем коде создаетсяCustomer объект из полей String в массиве строк.Метод trim() класса String удаляет пробелы в начале и конце каждого поля.Затем добавьте каждого клиента в коллекцию List<Customer>.


Заметки о Customer классе:

  • Нет необходимости инициализировать переменную экземпляра String s для null;по умолчанию они null.
  • Имена переменных должны быть camelCase (не начинающиеся с заглавной буквы) и без подчеркивания.
  • Переменная SPN_SP: это соглашениечто только константы (статические и конечные поля) представлены в верхнем регистре.
0 голосов
/ 26 декабря 2018

Установите этот флажок

List<Customer> customers = new ArrayList<Customer>();
String [] arr = new String[6];

   while (input.hasNextLine()) {                   
    arr =  input.nextLine().split("\\|");
    Customer customer = new Customer(arr[0],arr[1],arr[2],arr[3]arr[4],arr[5])
    customers.add(customer);

}

вы можете перебрать список, чтобы увидеть

for(Customer c: customers){
    System.out.println(c.toString());
}

Важно упомянуть '|'является особенным символом в Java, вы должны поставить это "\\ |"распознать это '

0 голосов
/ 26 декабря 2018

Вот способ, которым вы можете сделать это: перебрать все строки в файле и проанализировать Customer из каждой строки, где анализ включает разбиение строки на поля, разделенные | и удаление пробелов.

public static void main(String[] args) {
    // ...
    KE_Globals.dataFile = fileChooser.getSelectedFile().getAbsoluteFile();
    List<Customer> customers = new ArrayList<>();
    Scanner input = new Scanner(KE_Globals.dataFile);
    while (input.hasNextLine()) {
        String customerRecord = input.nextLine();
        customers.add(Customer.parseFromRecord(customerRecord));
    }
}

class Customer {
    private String printSequence = null;
    private String indication = null;
    // ... more fields

    // probably don't want this part of the class interface
    private Customer() {}

    static Customer parseFromRecord(String recordLine) {
        // splits the string while removing extra whitespace
        String[] fields = recordLine.split("\\s*\\|\\s*");
        if(fields.length != 408) {
            throw new IllegalArgumentException("Customer record '" + recordLine + "' is invalid.");
        }

        Customer c = new Customer();
        c.printSequence = fields[0];
        c.indication = fields[1];
        // ... for each field

        return cust;
    }
}
0 голосов
/ 26 декабря 2018

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

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

Скажем так: String s = input.nextLine ();

Затем, используя String # split ("|"), мы можем легко разбить различные части этой строки на те, которые мыхочу.Допустим, у нас есть строка:

"00001         |Ordinary  |           |Notice Bill|      | C10"

Затем, если это ввод, который мы получили, выполнив input.nextLine (), мы можем вызвать s.split ("|"), который даст наммассив следующих строк:

String[] array = {"00001         ","Ordinary  ","           ","Notice Bill","      "," C10"};

String также имеет хороший метод, называемый String # trim (), который удаляет все начальные и конечные пробелы (пробелы, табуляции и т. д.).

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

So now, we have that array = {"00001","Ordinary","","Notice Bill","","C10"}.

Теперь у нас есть кое-что, с чем мы можем легко работать.Предполагая, что выполняется тот же самый порядок (который он есть), мы можем сказать:

Customer c = new Customer(array[0], array[1], array[2], array[3], array[4], array[5]);

Комбинируя все это, мы можем сделать следующее (взяв отрывок из вашего кода):

while (input.hasNextLine()) {
    String nextInput = input.nextLine();
    String[] pI = nextInput.split("\\|"); //pI stands for parseableInput, escape the pipe character ('|') since it's a special char in Java.
    for(int i = 0; i < nextInput.length; i++) { //trim all of the input
        pI[i] = pI[i].trim();
    }
    Customer next = new Customer(pI[0], pI[1], pI[2], pI[3], pI[4], pI[5]);
    customers.add(next);
}

Я написал это более многословно, чтобы сделать его легко читаемым.Это должно работать для каждой строки, потому что они каждый раз имеют одинаковый стиль.Если вы хотите, вы можете также сделать пустые строки представленными для клиента как «ноль», что может помочь очистить код.

Надеюсь, это помогло.

Редактировать: Добавлены цитаты в строки для ясности.

0 голосов
/ 26 декабря 2018

Предполагая, что это 00001 |Ordinary | |Notice Bill| | C10 запись клиента из файла, затем разбейте строку на основе | pipe

List<Customer> customers = new ArrayList<Customer>();
while (input.hasNextLine()) {
String customeRecord = input.nextLine().split("[|]");  //or  \\|

Customer record = new Customer(customeRecord[0],customeRecord[1],customeRecord[2],customeRecord[3],customeRecord[4],customeRecord[5]);

 //finally add this customer object to List
  customers.add(record);
}

Примечание: при разбиении строки 00001 |Ordinary | |Notice Bill| | C10основанный на трубе | каждая часть будет с некоторыми пробелами, вам нужно обрезать пробелы, чтобы получить точное значение, и если первая строка - заголовки, вы должны игнорировать это также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...