Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara mengetahui bagaimana file DBF atau file apa pun diformat?

Saya memiliki masalah yang sama dan beginilah cara saya melakukannya.

TL;DR:Anda harus menggunakan Apache Tika untuk mengurai file DBase. Ini mengubah konten menjadi tabel XHTML dan mengembalikannya sebagai java.lang.String , yang dapat Anda uraikan melalui DOM atau pengurai SAX untuk mendapatkan data dalam format yang Anda butuhkan. Berikut beberapa contohnya:https://tika.apache.org/1.20/examples.html

Untuk memulai, tambahkan ketergantungan Maven berikut ke POM Anda:

<dependency>
  <groupId>org.apache.tika</groupId>
  <artifactId>tika-parsers</artifactId>
  <version>1.21</version>
</dependency>

Kemudian inisialisasi pengurai:

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

Sekarang, untuk mengonversi data menjadi format yang lebih nyaman (dalam hal ini CSV), saya melakukan hal berikut:

Pertama, ubah seluruh String menjadi objek 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

Sekarang, untuk mendapatkan header:

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();
}

Kemudian recordnya:

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);
    }

Akhirnya, kami menggabungkannya untuk membentuk CSV:

StringBuilder dbaseCsvStringBuilder = new StringBuilder(String.join(",", headers) + "\n");
for(String[] record : records)
        dbaseCsvStringBuilder.append(String.join(",", record) + "\n");
String csvString = dbaseCsvStringBuilder.toString();

Berikut source code lengkapnya: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. Bagaimana Menjadwalkan Pekerjaan di Oracle SQL Developer?

  2. Bagaimana NOMOR Oracle memiliki Skala lebih besar dari Presisi?

  3. Nilai terkecil tetapi tidak NULL di Oracle SQL

  4. Pesan berdasarkan 2 nilai kolom

  5. Oracle PL/SQL:Cara mencetak tipe tabel