工具 - 数据库数据转MarkDown

在这里插入图片描述

public class TableDemo {


    public static void main(String[] args) {
        String headersJson = "[\n" +
                "            {\n" +
                "                \"columnDescription\": \"航name\",\n" +
                "                \"columnName\": \"name\",\n" +
                "            },\n" +
                "            {\n" +
                "                \"columnDescription\": \"航id\\n\",\n" +
                "                \"columnName\": \"id\",\n" +
                "            }\n" +
                "        ]";

        String rowsJson = "[\n" +
                "    {\n" +
                "        \"name\": \"sc2\",\n" +
                "        \"id\": \"1\"\n" +
                " \n" +
                "    },\n" +
                "    {\n" +
                "        \"name\": \"sc1\",\n" +
                "        \"id\": \"2\"\n" +
                "    }\n" +
                "]";

        JSONArray tableHeaders = JSONArray.parseArray(headersJson);
        List<Map<String, Object>> tableRows = JSON.parseObject(rowsJson, new TypeReference<List<Map<String, Object>>>(){});


        String markdownTable = generateDbMarkdownTable(tableHeaders, tableRows);
        System.out.println(markdownTable);
    }




    private static final String HEADER_SEPARATOR = "|";
    private static final String CELL_SEPARATOR = "|";


    private static String generateDbMarkdownTable(JSONArray tableHeaders, List<Map<String, Object>> tableRows) {
        List<JSONObject> headerList = tableHeaders.stream().map(tableHeader -> (JSONObject) tableHeader)
                .collect(Collectors.toList());

        String headerRow = headerList.stream()
                .map(header -> sanitizeHeader(header.getString("columnDescription")))
                .collect(Collectors.joining(" " + CELL_SEPARATOR + " ", HEADER_SEPARATOR + " ", " " + HEADER_SEPARATOR + "\n"));



        String separatorLine = headerList.stream()
                .map(header -> repeatString("-", Math.max(3, sanitizeHeader(header.getString("columnDescription")).length())))
                .collect(Collectors.joining(" " + CELL_SEPARATOR + " ", HEADER_SEPARATOR + " ", " " + HEADER_SEPARATOR + "\n"));


        StringBuilder markdownTable = new StringBuilder(headerRow).append(separatorLine);

        for (Map<String, Object> row : tableRows) {
            String rowLine = headerList.stream()
                    .map(header -> formatCellValue(row.get(header.getString("columnName"))))
                    .collect(Collectors.joining(" " + CELL_SEPARATOR + " ", HEADER_SEPARATOR + " ", " " + HEADER_SEPARATOR + "\n"));
            markdownTable.append(rowLine);
        }



        return markdownTable.toString();
    }


    private static String sanitizeHeader(String header) {
        return header.replace("\n", " ").replaceAll("\\s+", " ").trim();
    }

    private static String repeatString(String str, int count) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < count; i++) {
            sb.append(str);
        }
        return sb.toString();
    }



    private static String formatCellValue(Object value) {
        if (value == null) {
            return "";
        } else if (value instanceof String && isJson((String) value)) {
            return formatJsonString((String) value);
        } else {
            return escapeMarkdown(value.toString());
        }
    }


    private static String formatJsonString(String jsonString) {
        return escapeMarkdown(jsonString.replace("\n", "").replace("\"", "\\\""));
    }

    private static String escapeMarkdown(String value) {
        return value.replace("|", "\\|");
    }

    private static boolean isJson(String value) {
        try {
            JSON.parse(value);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值