Как читать текстовый файл построчно в Java и исключать некоторые строки, начинающиеся с указанной c строки - PullRequest
0 голосов
/ 22 марта 2020

Я хочу прочитать текстовый файл и ввести данные, чтобы я мог создать объект класса Patient из входного параметра. текстовый файл содержит различные строки и категории, первые несколько строк содержат данные для класса пациента, следующие несколько строк содержат данные для класса препарата, третья категория содержит данные врача для класса врача. следующим образом

"myFile.txt" - это имя моего файла и содержит следующие данные enter image description here

Поэтому я хочу прочитать этот файл и ввести данные таким образом, чтобы Я могу создать объект соответствующего класса для объекта пациента, объекта лекарства и объекта врача. Я пытался следующим образом, но я не могу разделить категорию. мой программный код читает все файлы и вводит их в объект пациента. поэтому любая помощь приветствуется.

Примечание: я уже создал классы Patient, Drug & Physician в других файлах классов, у меня нет проблем с созданием классов. Я только хочу прочитать данные из этого основного класса текстового файла и создать объект класса. Поэтому моя проблема заключается только в том, как построчно читать текстовый файл на основе параметров класса и извлекать из него данные в качестве входных данных для моих объектов класса.

вот мой код

import java.util.Scanner;
import java.util.ArrayList;
import java.io.File;
import java.io.FileNotFoundException;

public class Lsystem{
    static ArrayList<Patient> pList;
   static ArrayList<Drug> dList;
   static   ArrayList<Physician> plist;
  public static void main(String[] args) throws FileNotFoundException{

    pList = new ArrayList<Patient>();
   dList = new ArrayList<Drug>();
  plist = new ArrayList<Physician>() ;



      File dataFile = new File("myFile.txt");
      Scanner inputData = null;
      try {
        inputData = new Scanner(dataFile);
      }
      catch(Exception e) {
        System.out.println(e);
        System.exit(1);
      }
      // skip first line
      String[] line = inputData.nextLine().split(" ");

            //read next lines
           while( inputData.hasNextLine()) {
              if(!(inputData.hasNext("# drugs  "))){
                line = inputData.nextLine().split(",");
                String name = line[0];
                String securityNum = line[1];
                Patient newPatient = new Patient(name,securityNum);
                pList.add(newPatient);
              }

      }

      for(Patient pas:pList){
        System.out.println(pas);
      }
 else if ((inputData.hasNext("# drugs")))
      while( inputData.hasNextLine() && (!(inputData.hasNext("# Physician ")))) {

           line = inputData.nextLine().split(",");
           String name = line[0];
           String type = line[1];
           double price = Double.parseDouble(line[2]);
           double kg = Double.parseDouble(line[3]);
           int conc = Integer.valueOf(line[4]);
           Drug newDrug = new Drug(name,type,price,kg,conc);
           dList.add(newDrug);


 }

 for(Drug drg:dList){
   System.out.println(drg);
 }
      //  an so on for Physician data as well
       // .......

    }
  }

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Используются File и Scanner для обработки входного файла, показанного в вопросе. Предполагается, что файл строго следует образцу вопроса. Например, должно быть три раздела, по крайней мере, одна запись в каждом разделе. Также предполагается, что нет пустых строк - даже в конце файла.

В этом смысле это решение хрупкое и отсутствует необходимая ошибка код проверки и проверки. В противном случае это решение вопроса.

См. Код для дополнительных комментариев.

Основным моментом, основанным на ваших комментариях, является, вероятно, рассмотрение логики c, управляющей тем, как * Вызывается scanner.nextLine().

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.List;
import java.util.ArrayList;

public class ProcessDataFile {

    // Our three lists for our three classes of object:
    final List<Patient> patients = new ArrayList();
    final List<Drug> drugs = new ArrayList();
    final List<Physician> physicians = new ArrayList();

    // The file scanner:
    Scanner scanner;

    // The currently processed line:
    String line;

    public void populateLists() throws FileNotFoundException {

        File file = new File("C:/tmp/medical_data.txt");
        scanner = new Scanner(file);

        // process the file, one line at a time
        while (scanner.hasNextLine()) {
            line = scanner.nextLine();
            processLine();
        }
        printResults();
    }

    // process each line in the file
    private void processLine() {
        if (line.startsWith("# Patient")) {
            line = scanner.nextLine();
            processPatients();
        }
        if (line.startsWith("# drug")) { // note the "d" in drug - not "D"!
            line = scanner.nextLine();
            processDrugs();
        }
        if (line.startsWith("# Physician")) {
            line = scanner.nextLine();
            processPhysicians();
        }
    }

    private void processPatients() {
        while (!line.startsWith("#")) {
            String[] fields = line.split(",");
            // TODO - add check to make sure 2 values are in the split string.
            Patient patient = new Patient(
                    fields[0].trim(),
                    fields[1].trim());
            patients.add(patient);
            line = scanner.nextLine();
        }
    }

    private void processDrugs() {
        while (!line.startsWith("#")) {
            String[] fields = line.split(",");
            // TODO - add check to make sure 5 values are in the split string,
            // and are of the expected data type:
            Drug drug = new Drug(
                    fields[0].trim(),
                    fields[1].trim(),
                    Double.parseDouble(fields[2].trim()),
                    Double.parseDouble(fields[3].trim()),
                    Integer.parseInt(fields[4].trim()));
            drugs.add(drug);
            line = scanner.nextLine();
        }
    }

    private void processPhysicians() {
        while (!line.startsWith("#")) {
            String[] fields = line.split(",");
            // TODO - add check to make sure 2 values are in the split string,
            // and are of the expected data type:
            Physician physician = new Physician(
                    fields[0].trim(),
                    Long.parseLong(fields[1].trim()));
            physicians.add(physician);
            if (scanner.hasNextLine()) {
                // this may be the end of the file already... this assumes
                // that the physicians section is the final section.
                line = scanner.nextLine();
            } else {
                return; // to avoid never exiting this method
            }
        }
    }

    private void printResults() {
        patients.forEach((patient) -> {
            System.out.println(patient.name + " : " + patient.securityNum);
        });
        // and the same for the other 2 beans...
    }

}

Это распечатывает следующее:

Patient1 : 1234
Patient2 : 456

И, если этот недостающий код добавляется, он распечатает 2 других компонента.

0 голосов
/ 22 марта 2020

надеюсь, что это то, что вам нужно (это грязно, но ...):

Я предполагаю, что ваш текстовый файл ТОЧНО, как в примере ниже: (file -> text.txt)

# Patient (name, securityNum)
Patient1, 1234
Patient2, 456
# drugs (name, type,pric,kg,concent)
drug1, type1, 12,51,10
drug2, type2,22,42,56
# Physician (name, Idnum)
dr.aaaa, 1234
dr.bbbbb, 456

это главное (вы должны изменить путь к файлу text.txt):

    import java.io.File;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Scanner;

    public class MainTest {

        public static void main(String[] args) throws Exception {
        //set the path of your text file
                File file = new File(MainTest.class.getClassLoader().getResource("text.txt").getFile());
                Scanner myReader = new Scanner(file);
            StringBuilder sb = new StringBuilder();
            while (myReader.hasNextLine()) {
                String tmp = myReader.nextLine();
                sb.append(tmp + "\n");
            }
            myReader.close();

            String[] type = sb.toString().split("#");
            String patients = type[1];
            String drugs = type[2];
            String doctors = type[3];

            patients = patients.replace("Patient (name, securityNum)\n","");
            drugs = drugs.replace("drugs (name, type,pric,kg,concent)\n","");
            doctors = doctors.replace("Physician (name, Idnum)\n","");



            System.out.println("°°°°°°°°°°°°°°°°°°°°°°°°°°°");
            populatePatientBean(patients).forEach( patient -> {
                System.out.println("\nname " + patient.getName());
                System.out.println("num " + patient.getSecurityNum());
            });

            populateDrugsBean(drugs).forEach( drugs_ -> {
                System.out.println("\nname " + drugs_.getName());
                System.out.println("type " + drugs_.getType());
                System.out.println("concent " + drugs_.getConcent());
                System.out.println("kg " + drugs_.getKg());
            });

            populatePhysicianBean(doctors).forEach( doctor -> {
                System.out.println("\nname " + doctor.getName());
                System.out.println("id " + doctor.getIdNum());
            });
            System.out.println("°°°°°°°°°°°°°°°°°°°°°°°°°°°");

        }

        public static List<Patient> populatePatientBean(String linePatient){
            List<String> patientsTot = Arrays.asList(linePatient.split("\n"));
            List<Patient> patientListReturn = new ArrayList<>();
            patientsTot.forEach( line -> {
                String[] arrayString = line.split(",");
                Patient patient = new Patient(arrayString[0].trim(),arrayString[1].trim());
                patientListReturn.add(patient);
            });
            return patientListReturn;
        }

        public static List<Drugs> populateDrugsBean(String lineDrugs){
            List<String> drugsTot = Arrays.asList(lineDrugs.split("\n"));
            List<Drugs> drugsListReturn = new ArrayList<>();
            drugsTot.forEach( line -> {
                String[] arrayString = line.split(",");
                Drugs drugs = new Drugs(arrayString[0].trim(),arrayString[1].trim(),Float.valueOf(arrayString[2].trim()),Float.valueOf(arrayString[3].trim()),Float.valueOf(arrayString[4].trim()));
                drugsListReturn.add(drugs);
            });
            return drugsListReturn;
        }

        public static List<Physician> populatePhysicianBean(String linePhysician){
            List<String> physicianTot = Arrays.asList(linePhysician.split("\n"));
            List<Physician> physicianListReturn = new ArrayList<>();
            physicianTot.forEach( line -> {
                String[] arrayString = line.split(",");
                Physician physician = new Physician(arrayString[0].trim(),Long.valueOf(arrayString[1].trim()));
                physicianListReturn.add(physician);
            });
            return physicianListReturn;
        }}

ниже бобов ....

public class Patient {

    private String name;
    private String securityNum;

    public Patient(String name, String securityNum) {
        this.name = name;
        this.securityNum = securityNum;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSecurityNum() {
        return securityNum;
    }

    public void setSecurityNum(String securityNum) {
        this.securityNum = securityNum;
    }
}


public class Drugs {

    private String name;
    private String type;
    private float kg;
    private float concent;
    private float pric;

    public Drugs(String name, String type, float kg, float concent, float pric) {
        this.name = name;
        this.type = type;
        this.kg = kg;
        this.concent = concent;
        this.pric = pric;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public float getKg() {
        return kg;
    }

    public void setKg(float kg) {
        this.kg = kg;
    }

    public float getConcent() {
        return concent;
    }

    public void setConcent(float concent) {
        this.concent = concent;
    }

    public float getPric() {
        return pric;
    }

    public void setPric(float pric) {
        this.pric = pric;
    }
}


public class Physician {

    private String name;
    private long idNum;

    public Physician(String name, long idNum) {
        this.name = name;
        this.idNum = idNum;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getIdNum() {
        return idNum;
    }

    public void setIdNum(long idNum) {
        this.idNum = idNum;
    }
}
...