Мне нужна помощь с чем-то, что звучит легко, но вызвало у меня проблемы.
У меня есть текстовый файл (record.txt) с корневым элементом "PatientRecord" и подтеками в нем ("имя", "возраст", тип крови, адрес и т.д.), Которые повторяются снова и снова, но с разными так как это запись для каждого человека. Мне только интересно распечатать значения между тегами в новый текстовый файл для каждого человека, но только для тех элементов, которые я хочу. Например, с тегами, о которых я говорил выше, мне нужно только имя и возраст, но не остальная информация для этого пациента. Как распечатать только те значения, разделенные запятыми, а затем перейти к следующему пациенту? Вот код, который у меня есть.
package patient.records;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class ProcessRecords {
private static final String FILE = "C:\\Users\\Desktop\\records.txt";
private static final String RECORD_START_TAG = "<PatientRecord>";
private static final String RECORD_END_TAG = "</PatientRecord>";
private static final String newFileName = "C:\\Users\\Desktop\\DataFolder\\";
public static void main(String[] args) throws Exception {
String scan;
FileReader file = new FileReader(FILE);
BufferedReader br = new BufferedReader(file);
Writer writer = null;
while ((scan = br.readLine()) != null)
{
if (scan.contains(RECORD_START_TAG)) {
//This is the logic I am missing that will only grab the element values
//between the tags inside of the file
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(newFileName + "Record Data" + ".txt"), "utf-8"));
}
else if (scan.contains(RECORD_END_TAG)) {
writer.close();
writer=null;
}
else {
// only write if writer is not null
if (writer!=null) {
writer.write(scan);
}
}
}
br.close();
}
} //This is the end of my code
Текстовый файл (record.txt), который я читаю, выглядит следующим образом:
<PatientRecord> <---first patient record--->
<---XML Schema goes here--->
<Info>
<age>66</age>
<first_name>john</first_name>
<last_name>smith</last_name>
<mailing_address>200 main street</mailing_address>
<blood_type>AB</blood_type>
<phone_number>000-000-0000</phone_number>
</PatientRecord>
<PatientRecord> <---second patient record--->
<---XML Schema goes here--->
<Info>
<age>27</age>
<first_name>micheal</first_name>
<last_name>thompson</last_name>
<mailing_address>123 baker street</mailing_address>
<blood_type>O</blood_type>
<phone_number>111-222-3333</phone_number>
</PatientRecord>
Поэтому в теории, если я ТОЛЬКО хотел распечатать значения из имени, почтового адреса и типа крови из этого текстового файла для всех пациентов, он должен выглядеть так:
john, 200 main street, AB
//this line is blank
michael, 123 baker street, O
Спасибо за любую помощь. Если вы чувствуете, что мой код должен быть изменен, я все для этого. Спасибо.
Мое первое чувство кишки состоит в том, чтобы обернуть весь текстовый контент вокруг некоторого внешнего тега и обработать текст как XML, что-то вроде...
<Patients>
<PatientRecord> <---first patient record--->
<Info>
<age>66</age>
<first_name>john</first_name>
<last_name>smith</last_name>
<mailing_address>200 main street</mailing_address>
<blood_type>AB</blood_type>
<phone_number>000-000-0000</phone_number>
</PatientRecord>
...
</Patients>
Но есть две проблемы с этим...
Один <---first patient record--->
не является допустимым XML-комментарием или текстом и двумя, нет закрывающего </Info>
... [sigh]
Итак, моя следующая мысль была прочитана в каждом <PatientRecord>
качестве текста, а затем обработала это как XML
....
Здесь возникают проблемы... нам нужно удалить что-нибудь, окруженное <---... --->
включая маленькие стрелки... Есть много предположений об этом, но, надеюсь, мы можем его игнорировать...
Следующая проблема: нам нужно вставить закрывающий </Info>
...
После этого все очень просто...
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
public class Test {
private static final String RECORD_START_TAG = "<PatientRecord>";
private static final String RECORD_END_TAG = "</PatientRecord>";
public static void main(String[] args) {
File records = new File("Records.txt");
try (BufferedReader br = new BufferedReader(new FileReader(records))) {
StringBuilder record = null;
String text = null;
while ((text = br.readLine()) != null) {
if (text.contains("<---") && text.contains("--->")) {
String start = text.substring(0, text.indexOf("<---"));
String end = text.substring(text.indexOf("--->") + 4);
text = start + end;
}
if (text.trim().length() > 0) {
if (text.startsWith(RECORD_START_TAG)) {
record = new StringBuilder(128);
record.append(text);
} else if (text.startsWith(RECORD_END_TAG)) {
record.append("</Info>");
record.append(text);
try (ByteArrayInputStream bais = new ByteArrayInputStream(record.toString().getBytes())) {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(bais);
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression exp = xPath.compile("PatientRecord/Info/first_name");
Node firstName = (Node) exp.evaluate(doc, XPathConstants.NODE);
exp = xPath.compile("PatientRecord/Info/mailing_address");
Node address = (Node) exp.evaluate(doc, XPathConstants.NODE);
exp = xPath.compile("PatientRecord/Info/blood_type");
Node bloodType = (Node) exp.evaluate(doc, XPathConstants.NODE);
System.out.println(
firstName.getTextContent() + ", "
+ address.getTextContent() + ", "
+ bloodType.getTextContent());
} catch (ParserConfigurationException | XPathExpressionException | SAXException ex) {
ex.printStackTrace();
}
} else {
record.append(text);
}
}
}
} catch (IOException exp) {
exp.printStackTrace();
}
}
}
Что печатает...
john, 200 main street, AB
micheal, 123 baker street, O
Долго и коротко это, вернитесь к человеку, который дал вам этот файл, ударил их, а затем попросил, чтобы они ввели правильный формат XML...
BufferedWriter
, но это я.
Используйте парсер DOM и проанализируйте текстовый файл. Вы можете увидеть один пример в этой ссылке