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

    完全なソース コードは次のとおりです。 DbaseReader.java">https://github.com/Debojit/DbaseTranslater/blob/master/src/main/java/nom/side/poc/file/dbf/DbaseReader.java




    1. loaddataコマンドを使用せずにデータベースにデータを入力する

    2. タイムスタンプの月の部分でグループ化するSQLクエリ

    3. PHP/OCIで最後に挿入されたROWIDを取得する

    4. ハイブリッドクラウドPostgreSQLの導入のヒント