Tôi đã gặp sự cố tương tự và đây là cách tôi đã làm.
TL; DR:Bạn sẽ cần sử dụng Apache Tika
để phân tích cú pháp các tệp DBase. Nó chuyển đổi nội dung thành bảng XHTML và trả về dưới dạng java.lang.String
, bạn có thể phân tích cú pháp thông qua DOM hoặc trình phân tích cú pháp SAX để nhận dữ liệu ở định dạng bạn cần. Dưới đây là một số ví dụ: https://tika.apache.org/1.20/examples.html
Để bắt đầu, hãy thêm phần phụ thuộc Maven sau vào POM của bạn:
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>1.21</version>
</dependency>
Sau đó khởi tạo trình phân tích cú pháp:
Parser parser = new DBFParser(); //Alternatively, you can use AutoDetectParser
ContentHandler handler = new BodyContentHandler(new ToXMLContentHandler()); //This is tells the parser to produce an XHTML as an output.
parser.parse(dbaseInputStream, handler, new Metadata(), new ParseContext()); // Here, dbaseInputStream is a FileInputStream object for the DBase file.
String dbaseAsXhtml = handler.toString(); //This will have the content in XHTML format
Bây giờ, để chuyển đổi dữ liệu sang định dạng thuận tiện hơn (trong trường hợp này là CSV), tôi đã làm như sau:
Đầu tiên, chuyển đổi toàn bộ chuỗi thành một đối tượng DOM:
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document xhtmlDoc= builder.parse(new InputSource(new StringReader(xmlString.trim().replaceAll("\t", "")))); //I'm trimming out the tabs and whitespaces here, so that I don't have to dealt with them later
Bây giờ, để lấy tiêu đề:
XPath xPath = XPathFactory.newInstance().newXPath();
NodeList tableHeader = (NodeList)xPath.evaluate("//table/thead/th", xhtmlDoc, XPathConstants.NODESET);
String [] headers = new String[tableHeader.getLength()];
for(int i = 0; i < tableHeader.getLength(); i++) {
headers[i] = tableHeader.item(i).getTextContent();
}
Sau đó, các bản ghi:
XPath xPath = XPathFactory.newInstance().newXPath();
NodeList tableRecords = (NodeList)xPath.evaluate("//table/tbody/tr", xhtmlDoc, XPathConstants.NODESET);
List<String[]> records = new ArrayList<String[]>(tableRecords.getLength());
for(int i = 0; i < tableRecords.getLength(); i++) {
NodeList recordNodes = tableRecords.item(i).getChildNodes();
String[] record = new String[recordNodes.getLength()];
for(int j = 0; j < recordNodes.getLength(); j++)
record[j] = recordNodes.item(j).getTextContent();
records.add(record);
}
Cuối cùng, chúng tôi kết hợp chúng lại với nhau để tạo thành một CSV:
StringBuilder dbaseCsvStringBuilder = new StringBuilder(String.join(",", headers) + "\n");
for(String[] record : records)
dbaseCsvStringBuilder.append(String.join(",", record) + "\n");
String csvString = dbaseCsvStringBuilder.toString();
Đây là mã nguồn hoàn chỉnh: https://github.com/Debojit/DbaseTranslater/blob/master/src/main/java/nom/side/poc/file/dbf/DbaseReader.java