Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да разберете как е форматиран DBF файл или друг файл?

Имах подобен проблем и ето как го направих.

TL;DR:Ще трябва да използвате Apache Tika за анализиране на DBase файлове. Той преобразува съдържанието в XHTML таблица и го връща като java.lang.String , който можете да анализирате чрез DOM или SAX анализатор, за да получите данните във формата, от който се нуждаете. Ето няколко примера:https://tika.apache.org/1.20/examples.html

За да започнете, добавете следната зависимост на Maven към вашия POM:

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

След това инициализирайте анализатора:

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

Сега, за да конвертирам данните в по-удобен формат (в този случай CSV), направих следното:

Първо преобразувайте целия низ в 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

Сега, за да получите заглавките:

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

След това записите:

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

Накрая ги събираме заедно, за да образуваме CSV:

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

Ето пълния изходен код: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. Кой е най-добрият метод винаги да получавате 2 знака след десетичната запетая в Oracle?

  2. Как да получите достъп до базата данни на Oracle през мрежа?

  3. Вмъкнете xmltype в xmltype на определено място [PL/SQL]

  4. как да преместите шаблон за пръстови отпечатъци в база данни на Oracle

  5. Грешка при несъответствие на Oracle.DataAccess