0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Go言語学習】txtファイルをgoファイルへ変換

Posted at

「エキスパートたちのGo言語」という書籍を購入し(2022年1月12日)、勉強をし出したところ(2024年5月1日)、サンプルコードがありダウンロードした。https://gihyo.jp/book/2022/978-4-297-12519-6/support
サンプルコードは、txtファイルであった。

txtファイルをgoファイルへ

せっかくならgoファイルに変換し、エディターを使っていじったり動かしたりしたかったので、取り急ぎ全ファイルを変換することに。
しかし、txtファイルのエンコードがまちまちで、そのまま変換すると文字化けするので、良い方法を探したが、結論から言うと見つからなかった。
一応、何をしたか備忘録をとることに。

やったこと

pythonで、各txtファイルからエンコーディングの種類を読み込み、各txtファイルを各エンコーディングで開き、UTF-8でエンコーディングし閉じる
Go言語で、ファイルの拡張子を txt → go へ変換
結果、Windows-1254 は UTF-8 にうまくエンコードできず、文字化けした

コード

これは、とりあえずpython使って、エンコーディングを検出してるだけのコード

import os
import chardet

def detect_encoding(file_path):
    with open(file_path, 'rb') as f:
        rawdata = f.read()
    return chardet.detect(rawdata)['encoding']

def detect_encodings_in_folder(folder_path):
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            if file.endswith('.txt'):
                file_path = os.path.join(root, file)
                encoding = detect_encoding(file_path)
                print(f'File: {file_path}, Encoding: {encoding}')

# 基準フォルダパスを指定
folder_path = '.'
detect_encodings_in_folder(folder_path)

続いて、python使ってエンコーディングを検出し、検出したエンコーディングでファイルを開いて、UTF-8でエンコードするつもり...うまく行かなかった

import os
import chardet
import codecs

i = 0

def convert_encoding(file_path, target_encoding='utf-8'):
    global i
    i += 1
    # Detect current encoding
    with open(file_path, 'rb') as f:
        rawdata = f.read()
    current_encoding = chardet.detect(rawdata)['encoding']
    print(i,": befor_current_encoding :",current_encoding)

    # Open the file in the detected encoding
    with codecs.open(file_path, 'r', encoding=current_encoding, errors='ignore') as f:
        content = f.read()

    # Write the content back to the file in the target encoding
    with codecs.open(file_path, 'w', encoding=target_encoding) as f:
        f.write(content)
        
    # Chack current encoding
    with open(file_path, 'rb') as f:
        rawdata = f.read()
    current_encoding = chardet.detect(rawdata)['encoding']
    print(i, ": after_current_encoding :",current_encoding)

def convert_encodings_in_folder(folder_path):
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            if file.endswith('.txt'):
                file_path = os.path.join(root, file)
                convert_encoding(file_path)

# 基準フォルダパスを指定
folder_path = '.'
convert_encodings_in_folder(folder_path)

続いてGoを使って、拡張子の変更

package main

import (
	"os"
	"path/filepath"
	"strings"
)

func visit(path string, f os.FileInfo, err error) error {
	if !f.IsDir() && strings.HasSuffix(path, ".txt") && !strings.HasSuffix(path, "README.txt") {
		newPath := strings.TrimSuffix(path, filepath.Ext(path)) + ".go"
		os.Rename(path, newPath)
	}
	return nil
}

func main() {
	root := "." // 基準フォルダパスを指定
	filepath.Walk(root, visit)
}

結局うまく行かんかったし、全然Go言語の勉強が出来なかった😨

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?