Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để tìm ra cách một tệp DBF hoặc bất kỳ tệp nào được định dạng?

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng select trong ELSE của câu lệnh CASE cho tôi ORA-00937:không phải là một hàm nhóm đơn

  2. Sử dụng nhiều trình điều khiển Oracle JDBC trong một ứng dụng Java?

  3. Oracle:'Thực thi ngay lập tức' nghĩa là gì?

  4. Phân tích cú pháp tệp SQL với PL / SQL và DML / DDL bằng cx_Oracle trong python

  5. Lỗi C # ORA 00907:Thiếu dấu ngoặc đơn phải