将.txt转换为.sql文件后编码错误

时间:2018-01-14 15:30:46

标签: java mysql file encoding filereader

我有一个 .txt 文件,其中包含数百万邮政编码。 都有格式良好(可读)。 我的目标是将邮政编码导入MySql数据库 我需要将 .txt 文件中的邮政编码转换为 .sql 文件。

我编写了一个 Java 应用程序来将重要部分转换为SQL文件。

编辑 .txt 文件包含许多信息。这就是我想要读取文件(在Java中),过滤文件内容并最终创建 .sql 文件的原因。非常感谢用“Python,SQL,C ++,BrainF ***”或其他语言编写的任何解决方案,但我很感激我的特定 Java 代码的解决方案。 .txt 文件使用UTF-8编码。

转换为“.sql”后,内容有几个问题。 例如,SQL文件中的西里尔字符“Я”不是“已知”。 我认为,编码是错误的 如果有人能帮我弄清楚如何解决这个问题,那就太好了。

TXT-文件: TXT-File

SQL-File:SQL-File

try (BufferedReader br = new BufferedReader(
            new FileReader(GeoData.class.getResource(sourceFilenameInput.getText().trim()).getFile().trim()))) {
        for (String line; (line = br.readLine()) != null;) {
            GeoData geoData = new GeoData();
            geoData.addOrt(getPlaceFromFile(line));
        }

getPlaceFromFile方法:

private String getPlaceFromFile(String line) {
    String[] placeHolder = line.split("\t");
    if (placeHolder .length > 2) {
        for (int i = 0; i < placeHolder .length - 2; i++) {
            if (!placeHolder [i + 2].trim().isEmpty() && placeHolder [i + 2].trim().length() > 3) {
                return filterPlace(placeHolder [i + 2].trim(), "'", "\\", "^", ";", "*", "|");
            }
        }
    }
    return "EMPTY";
}

FilterPlace方法:

private String filterPlace(String place, String... filter) {
    String newPlace = place;
    for (String string : filter) {
        if (newPlace .trim().contains(string))
            newPlace = newPlace .trim().replace(string, " ");
    }
    return newPlace;
}

到目前为止我尝试过什么? 我将FileReader替换为InputStreamReader,并将FileInputStream与Charset UTF-8 一起使用。在UTF-8中转换后,SQL-File看起来像这样:
UTF8 Converted SQL-FILE

2 个答案:

答案 0 :(得分:1)

我找到了答案。

我刚刚编辑了eclipse中的编码格式来解决问题。

Workspace&gt; Preferences&gt; General&gt;点击Workspace并修改Text file encodingCp1252UTF-8

这就是全部而且有效。

答案 1 :(得分:0)

如果.txt列在\t上拆分,请不要在加载前进行转换。而只需使用LOAD DATA INFILE ... SQL语句,如

 LOAD DATA LOCAL INFILE 'the_file.txt'
     INTO tablename
     CHARACTER SET utf8mb4
     COLUMNS TERMINATED BY "\t"
     LINES TERMINATED BY "\n"
     (col1, zip, name);

我不知道如何从Java运行它。但是,您提供的代码都不需要。

你的评论中有一些垃圾 -

E2808B     8203=x200B  [​]   BN  ZERO WIDTH SPACE
E2808C     8204=x200C  [‌]   BN  ZERO WIDTH NON-JOINER

(我通过双击十六进制来发现它来复制它。但它停在中间!)

Д为十六进制D094,但如果您double encode,则会获得十六进制C390 E2809D。请查看该链接,了解可能的原因。