HTML TABLE到CSV转换器

时间:2014-12-09 03:51:53

标签: java csv

我正在尝试将简单(但很大)的HTML表格转换为Java格式的CSV。

我试过四处寻找代码,但不是更明智。如果有人能指出我正确的方向,我将非常感激。

这是我想要转换的html表文件:

<table border="1" width="100%">
<tr>
<th>Destination</th>
<th>Dial Code</th>
<th>Rate</th>
<th>Currency</th>
<th>Next Change</th>
<th>New Rate</th>
<th>Comments</th>
</tr>
<tr>
<td>Afghanistan Mobile Afghan Telecom</td>
<td>9375</td>
<td>0.1829</td>
<td>USD</td>
<td>----</td>
<td>----</td>
<td>----</td>
</tr>
<tr>
<td>Afghanistan Mobile Awcc</td>
<td>9370</td>
<td>0.1777</td>
<td>USD</td>
<td>----</td>
<td>----</td>
<td>----</td>
</tr>
<tr>
<td>Afghanistan Mobile Etisalat</td>
<td>9378</td>
<td>0.1595</td>
<td>USD</td>
<td>----</td>
<td>----</td>
<td>----</td>
</tr>
<tr>
<td>Afghanistan Mobile Mtn (Afghanistan)</td>
<td>9376</td>
<td>0.191</td>
<td>USD</td>
<td>----</td>
<td>----</td>
<td>----</td>
</tr>

4 个答案:

答案 0 :(得分:4)

使用Jsoup很容易。你应该解析每一行并遍历该行中的每个单元格,用逗号分隔它们。像这样:

    try {
        FileWriter writer = new FileWriter("csv.txt");

        Document doc = Jsoup.parseBodyFragment(table);
        Elements rows = doc.getElementsByTag("tr");

        for (Element row : rows) {
            Elements cells = row.getElementsByTag("td");
            for (Element cell : cells) {
                writer.write(cell.text().concat(", "));
            }
            writer.write("\n");
        }
        writer.close();
    } catch (IOException e) {
        e.getStackTrace();
    }

答案 1 :(得分:1)

您可以使用正则表达式来制作一些东西,但更简单的方法是使用HTML解析器并从那里开始。 Jsoup是一个很好的。

This answer可能是一个很好的起点。

答案 2 :(得分:0)

如果您可以从html中提取数据并将其转换为json,那么您可以使用以下jsfiddle代码从json创建csv。

[jsfiddle]: http://jsfiddle.net/JXrwM/1801/ "Stack Overflow"

答案 3 :(得分:0)

您可以通过这个简单的代码完成此操作,无需使用任何外部库

public static ArrayList<String> readInCSVFormat(File htmlFile) throws FileNotFoundException, IOException {
    ArrayList<String> result = new ArrayList<>();
    ArrayList<String> data = FileUtil.readFile(htmlFile); //this method returns the html page line by line in ArrayList only
    outer: for (int i = 0; i < data.size(); i++) {
        String line = data.get(i).replaceAll("<[^>]*>", "").trim();
        if (!line.isEmpty()) {
            if (line.matches("[0-9]+")) { //can be changeable as per the needs and optional
                StringBuilder builder = new StringBuilder();
                for (; i < data.size(); i++) {
                    line = data.get(i).replaceAll("<[^>]*>", "").trim();
                    if (line.isEmpty()) {
                        result.add(builder.toString().substring(0, builder.toString().lastIndexOf(',')));
                        continue outer;
                    }
                    builder.append(line).append(",");
                }
            }
        }
    }
    return result;
}