मुझे भी इसी तरह की समस्या थी और मैंने इसे इसी तरह से किया।
TL;DR:आपको अपाचे टीका
का उपयोग करना होगा DBase फ़ाइलों को पार्स करने के लिए। यह सामग्री को एक XHTML तालिका में परिवर्तित करता है और इसे java.lang.String
. के रूप में लौटाता है , जिसे आप आवश्यक प्रारूप में डेटा प्राप्त करने के लिए किसी DOM या SAX पार्सर के माध्यम से पार्स कर सकते हैं। यहां कुछ उदाहरण दिए गए हैं:https://tika.apache.org/1.20/examples.htmlए>
शुरू करने के लिए, अपने पीओएम में निम्नलिखित मावेन निर्भरता जोड़ें:
<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
अब, डेटा को अधिक सुविधाजनक प्रारूप में बदलने के लिए (इस मामले में सीएसवी), मैंने निम्नलिखित किया:
सबसे पहले, पूरे स्ट्रिंग को 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