言語別 早見表
日本語CSVをプログラムで扱うときの最大の関門は文字コードです。どの言語でも「エンコーディングを明示する」が基本です。
| 言語 | 定番ライブラリ | 文字コード指定 | 一次情報 |
|---|---|---|---|
| Python | csv 標準モジュール / pandas | encoding= / open(..., encoding=) | csv モジュール公式 / read_csv 公式 |
| Excel VBA | QueryTables / OpenText | TextFilePlatform(65001 / 932) | Microsoft Learn |
| C# | TextFieldParser / CsvHelper | Encoding.GetEncoding(932) など | Microsoft Learn |
Python(標準ライブラリ csv)
import csv
# Shift-JIS の CSV を読む。newline="" を忘れると改行が二重になる
with open("sales.csv", encoding="cp932", newline="") as f:
reader = csv.DictReader(f)
for row in reader:
print(row["商品名"], row["売上"])
公式ドキュメントの DictReader は1行目をキーに辞書を返すため、列の順番が変わってもコードを直す必要がありません。自前で split(',') すると引用符で囲まれたカンマで列がずれるため、必ずcsvモジュールを使ってください。
Python(pandas)
import pandas as pd
df = pd.read_csv("sales.csv", encoding="cp932", dtype={"商品コード": str})
df.to_csv("out.csv", index=False, encoding="utf-8-sig")
read_csv の主なオプション(実務で頻出のもの):
| オプション | 意味 | 使う場面 |
|---|---|---|
encoding | 文字コード指定 | cp932 / utf-8 / utf-8-sig |
dtype | 列の型を固定 | 商品コード等で先頭0を守る |
sep | 区切り文字 | TSVは sep="\t" |
header | ヘッダー行の指定 | ヘッダーなしCSVは header=None |
skiprows | 先頭行の読み飛ばし | タイトル行つきのExcel出力CSV |
chunksize | 分割読み込み | 巨大ファイル(数百万行) |
Excel VBA
Sub ReadCsv()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(1)
With ws.QueryTables.Add(Connection:="TEXT;C:\data\sales.csv", Destination:=ws.Range("A1"))
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.TextFilePlatform = 65001 ' UTF-8。Shift-JIS なら 932
.TextFileColumnDataTypes = Array(2, 1, 1) ' 1列目を文字列に
.Refresh
End With
End Sub
QueryTables.Add(Microsoft Learn) は文字コードと列の型まで制御できるため、Workbooks.OpenText より確実です。TextFilePlatform の値は 65001=UTF-8、932=Shift-JIS です。
C#
// .NET Core / .NET 5+ では先に CodePages プロバイダを登録する
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
using var parser = new TextFieldParser(@"C:\data\sales.csv", Encoding.GetEncoding(932));
parser.SetDelimiters(",");
parser.HasFieldsEnclosedInQuotes = true;
while (!parser.EndOfData)
{
string[] fields = parser.ReadFields()!;
Console.WriteLine(string.Join(" / ", fields));
}
TextFieldParser(Microsoft.VisualBasic.FileIO) は引用符で囲まれたカンマを正しく解釈します。Encoding.GetEncoding(932) を使うには .NET Core 以降で System.Text.Encoding.CodePages パッケージの参照とプロバイダ登録が必要です。実務では CsvHelper(公式サイト) の利用も一般的です。
書き出し(CSV出力)
- pandas —
df.to_csv(path, index=False, encoding="utf-8-sig")。index=Falseを忘れると行番号列が増えます(公式)。 - Python 標準 —
csv.writerでwriterow()。数値は文字列化して渡します(公式)。 - VBA —
SaveAs FileFormat:=xlCSVUTF8でUTF-8保存。 - C# — CsvHelper の
WriteRecords()が定番。
書き出し後は、必ず一度テキストエディタで開いて「列数・引用符・文字コード」を確認してから渡してください。
encoding 指定 早見表
| ファイルの出どころ | 指定すべき値 |
|---|---|
| Excelの「CSV UTF-8」で保存 | utf-8-sig |
| Web・クラウドサービスのエクスポート | utf-8 |
| 国内業務ソフト(弥生会計・基幹システム等) | cp932 |
| 古い官公庁データ | shift_jis(化ける項目があれば cp932) |
| 不明 | chardet / charset-normalizer で検出してから指定 |
詳細な修復手順は 文字化けの専用ページ にまとめています。
よくある質問
Q.python csv 読み込みで UnicodeDecodeError が出ます
文字コードの指定と実ファイルが違います。まず utf-8、次に cp932 を試し、判別不明なら chardet で検出してください。詳細は文字化けページの診断手順へ。
Q.read_csv で先頭の0が消えます
dtype={"コード列": str} のように列を文字列型で読み込んでください。既に読んだ後では戻せません。
Q.csv.reader と csv.DictReader の違いは?
reader は下標(0,1,2…)で列にアクセス、DictReader はヘッダー名でアクセスします。列順が変わる可能性があるファイルは DictReader が安全です。
Q.巨大CSV(数百万行)を読むには?
pandas は chunksize で分割、または DuckDB に直接読ませてSQLで集計します。Excelには上限があるため対象外です。