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

5lhxktic  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(422)

我有一个.txt文件,里面有数百万个邮政编码。它们都是格式良好的(可读的)。我的目标是,将postalcode导入mysql数据库。
我需要将postalcodes从.txt文件转换成.sql文件。
我编写了一个java应用程序,将重要部分转换为sql文件。
编辑:.txt文件包含许多信息。这就是为什么我要读取文件(用java),过滤文件内容,最后创建一个.sql文件。非常感谢任何用“python、sql、c++、brainf***”或其他语言编写的解决方案,但我希望能为我的特定java代码提供一个解决方案。txt文件使用utf-8编码。
转换为“.sql”后,内容有几个问题。例如西里尔字符“я" 在sql文件中不是“known”。我想,编码是错误的。
如果有人能帮我找到解决这个问题的线索,那就太好了。
txt文件:txt文件
sql文件:sql文件

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";
}

过滤位置法:

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 使用utf-8字符集。转换为utf-8后,sql文件如下所示:
utf8转换的sql文件

ycggw6v2

ycggw6v21#

如果.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 但如果你对它进行双重编码,就会得到十六进制 C390 E2809D . 请查看该链接以了解可能的原因。

oxalkeyp

oxalkeyp2#

我找到了答案。
我刚刚编辑了eclipse的编码格式来解决这个问题。 Workspace > Preferences > General >点击 Workspace 并编辑 Text file encodingCp1252UTF-8 .
仅此而已,成功了。

相关问题