- 技術 💻
インポートとは|エクスポートとの違いと取り込みの失敗例
結論
インポートとは、外にあるデータやファイル・部品を、今使っているアプリやプログラムに取り込むことです。反対に、中にあるデータを外へ書き出すのがエクスポートで、2つは「書き出す→取り込む」の対になる操作です。貿易では「輸入」の意味で使います。
この記事でわかること
- 貿易・アプリ・プログラミングで違う「インポート」の意味の早見表
- CSV・JSON・vCardの取り込みで起きる失敗7種を再現した実物と直し方
- Python・JavaScript・Java・Goのimportの違いと、エラー原文
インポートは、もともと英語の import(外から中へ運び入れる)です。IT では「別のアプリで作ったデータを、このアプリで使える形に読み込む」ことを指し、プログラミングでは「別のファイルに書かれた機能を、このファイルで使えるようにする」命令の名前にもなっています。
flowchart TD
A[アプリA<br>前の住所録・前のDB] -->|エクスポート<br>書き出す| F[ファイル<br>CSV・JSON・vCard]
F -->|インポート<br>取り込む| B[アプリB<br>新しい住所録・新しいDB]
F -.->|ここで失敗しやすい<br>文字コード・区切り・項目の対応| B
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| インポートとは | 外のデータ・機能を、今の環境に取り込むこと | インポートとは(ふだんの意味とITの意味) |
| インポートとエクスポートの違い | 取り込むのがインポート、書き出すのがエクスポート | インポートとエクスポートの違い |
| アップロード・読み込みとの違い | アップロードは送るだけ。インポートは使える形に変換して入れる | アップロード・ダウンロードとの違い |
| 貿易のインポート | 輸入。申告→審査・検査→納税→許可の順に進む | 貿易のインポート(輸入) |
| CSVをインポートすると文字化けする | 文字コード(UTF-8かShift_JISか)を取り込む側で合わせる | CSVのインポートで失敗する原因 |
| 先頭の0や日付が変わる | 列を「文字列」として取り込む設定にする | CSVのインポートで失敗する原因 |
| 同じデータを2回入れてしまった | 主キーで重複を止め、上書き(upsert)を使い分ける | データベースへのインポート |
| プログラミングのimportとは | 別ファイル・ライブラリの機能を名前で使えるようにする命令 | プログラミングのimport |
確認環境:Ubuntu 24.04.5 LTS の作業用フォルダーで、自作の会員名簿(漢字・先頭が0の番号・改行入りのメモ・引用符を含む4行)を UTF-8・BOM付き UTF-8・Shift_JIS(cp932)・セミコロン区切り・タブ区切りの5種類のファイルに書き出し、Python 3.13.18 の csv モジュールと sqlite3 モジュール(SQLite 3.53.1)、LibreOffice 24.2.7.2 のヘッドレス変換(CSV フィルターの設定を4通り)で取り込みました。JSON は Python と Node.js 22.23.4、vCard 2.1/3.0 と Netscape 形式のブックマーク HTML は Python で読み、プログラミングの import は Python 3.13.18・Node.js 22.23.4・OpenJDK 21.0.12・Go 1.24.7 で成功例とエラーを実行しました。Go は外部からモジュールを取得しない設定(GOPROXY=off)で動かしています。ブラウザのブックマークの取り込み手順は Google Chrome ヘルプ、貿易の「輸入」の定義は関税法第2条(日本法令外国語訳データベース)と税関のカスタムスアンサー、CSV フィルターの設定値は LibreOffice ヘルプ、JSON の決まりは RFC 8259、Node.js の構文の自動判定は Node.js 公式ドキュメントで確かめました。図は mermaid 11.16.0 で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「インポートとは|エクスポートとの違いと取り込みの失敗例」
インポートとは(ふだんの意味とITの意味)
この節では、「インポート」という言葉が場面によってどう意味を変えるのかが、1つの表で分かります。
どの場面でも芯は同じで、「外にあるものを、内側で使えるように持ち込む」ことです。違うのは、持ち込むものが「品物」か「データ」か「プログラムの部品」かという点です。
| 場面 | インポートの意味 | 具体例 | 反対の言葉 |
|---|---|---|---|
| ふだんの言葉・貿易 | 輸入(外国から品物を国内に引き取る) | インポート品・インポートブランド・インポートカー | エクスポート(輸出) |
| アプリのデータ | 別のアプリで作ったデータを読み込んで登録する | 住所録の CSV を取り込む・ブックマークを移す・写真を取り込む | エクスポート(書き出し) |
| データベース | ファイルの行を表に入れる | CSV を表へ一括登録する・ダンプから戻す | エクスポート・ダンプ |
| プログラミング | 別ファイル・ライブラリの機能を使えるようにする命令 | Python の import json、JavaScript の import { x } from |
export(JavaScript など) |
| 設定の移行 | 前の環境の設定をまとめて読み込む | ブラウザの設定・エディタの設定・メールソフトのアカウント | エクスポート(設定の書き出し) |
IT 以外の人が「インポート」と聞いて思い浮かべるのは、輸入品のほうです。社内の会話で混ざると話がかみ合わないことがあるので、仕様書や手順書では「CSV の取り込み(インポート)」のように、何をどこへ入れるのかを添えると伝わりやすくなります。
1品物のインポート
外国の品物を国内に引き取ること。税関への申告と許可が要る。インポート品=輸入品。
2データのインポート
ファイルを読み、項目を対応付けて、アプリの中のデータとして登録すること。変換が伴う。
3プログラムのimport
別のファイルに書かれた関数やクラスを、名前で呼べるようにすること。コピーではなく参照。
インポートとエクスポートの違い(取り込む・書き出す)
この節では、インポートとエクスポートの違いと、2つがどう組み合わさって使われるのかが分かります。
エクスポートは「今のアプリの中身をファイルに書き出す」こと、インポートは「ファイルを読んで別のアプリの中に入れる」ことです。機種変更やソフトの乗り換えでは、前のアプリでエクスポートし、新しいアプリでインポートする、という2段階で引っ越します。
引っ越しにたとえると
見分ける問い:「データが今のアプリから出ていくのか、入ってくるのか」
| インポート(import) | エクスポート(export) | |
|---|---|---|
| 向き | 外→中(取り込む) | 中→外(書き出す) |
| 貿易での意味 | 輸入 | 輸出 |
| アプリでの操作の例 | CSV から連絡先を取り込む | 連絡先を CSV・vCard に書き出す |
| 失敗しやすい点 | 文字コード・区切り・項目の対応・重複 | 形式の選び方(表は残るが図は消える等) |
| 元のデータへの影響 | 取り込み先のデータが増える・上書きされる | 元のデータは変わらない |
| プログラミング | 他のファイルの機能を使う側 | 自分の機能を他から使えるように公開する側 |
エクスポート→インポートで、本当に同じデータになるか確かめる
SQLite の表を CSV にエクスポートし、別のデータベースへインポートして、件数と中身のハッシュ(要約値)を比べました。列をすべて文字列(text)にしておくと、先頭の0も含めて元と同じになりました。
import sqlite3, csv, hashlib
# エクスポート:表の中身を CSV に書き出す
with open("export.csv", "w", encoding="utf-8", newline="") as f:
w = csv.writer(f)
w.writerow([d[0] for d in src.execute("select * from members").description])
w.writerows(src.execute("select * from members order by id"))
# インポート:CSV を読んで別の DB の表に入れる
r = csv.reader(open("export.csv", encoding="utf-8", newline=""))
next(r) # 見出し行を飛ばす
dst.executemany("insert into members values(?,?,?,?,?,?)", r)
件数 3 3
ハッシュ 47d990b595cd6ebe 47d990b595cd6ebe
[('00123', '0600001', '09012345678'), ('00124', '1000005', '0312345678'), ('00125', '5300001', '0661234567')]
件数とハッシュが一致すれば、引っ越しで何も失われていません。取り込みのあとに「件数」と「中身の要約」を比べる習慣を付けると、文字化けや欠けにすぐ気づけます。
インポートとアップロード・ダウンロード・読み込みの違い
この節では、インポートと混同されやすい言葉との違いが分かります。
アップロードとダウンロードは「ファイルを送る・受け取る」だけで、中身を読んで登録するところまでは含みません。インポートは、受け取ったファイルを読み、アプリの中のデータに変換して入れるところまでを指します。
| 言葉 | 何をするか | 終わったあとの状態 |
|---|---|---|
| アップロード | 手元のファイルをサーバーやクラウドへ送る | ファイルが置かれただけ。中身はまだ使われていない |
| ダウンロード | サーバーのファイルを手元に受け取る | ファイルが手元にあるだけ |
| インポート | ファイルを読み、項目を対応付けて登録する | アプリの中のデータとして検索・編集できる |
| 開く・読み込み | ファイルをそのまま表示・編集する | 元のファイルを直接扱っている(保存すると元が変わる) |
| コピー | 同じファイルを別の場所に複製する | 形式は変わらない |
| 同期 | 2か所のデータを自動で同じに保ち続ける | 一度きりではなく、変更のたびに反映される |
たとえば Web の管理画面で「CSV をアップロードしてインポート」と書かれている場合、ファイルを送る操作(アップロード)と、送られたファイルをサーバーが読んで登録する処理(インポート)が続けて行われています。アップロードは成功したのにインポートでエラーになる、ということが起きるのはこのためです。
貿易のインポート(輸入)とは
この節では、ふだんの言葉としての「インポート=輸入」が、法律と手続きのうえでどう決まっているのかが分かります。
関税法第2条は、輸入を「外国から本邦に到着した貨物……を本邦に(保税地域を経由するものについては、保税地域を経て本邦に)引き取ることをいう」と定めています。輸出は「内国貨物を外国に向けて送り出すことをいう」です。港や空港に着いただけでは輸入ではなく、税関の許可を受けて国内に引き取った時点で輸入になります。
輸入(納税)申告
貨物を置いている保税地域を管轄する税関に申告する。
他の法令の許可・承認
食品・医薬品など、他の法律で許可や承認が要る貨物は、税関の許可の前に所管の省庁から受けておく。
審査・検査
税関が書類を審査し、必要に応じて貨物を検査する。
関税などの納付
関税・内国消費税・地方消費税がかかる場合に納める。
輸入許可→引き取り
原則として納税を確かめたあとに許可され、貨物は内国貨物になって国内に引き取れる。
流れは税関のカスタムスアンサー「1101 輸入通関手続の概要」に沿っています。必要な書類や個人輸入の扱いは貨物によって違うため、税関の該当ページや税関相談官で確かめるのが確実です。この記事の残りでは、IT の「データのインポート」と「プログラミングの import」を扱います。
アプリのデータをインポートする流れ
この節では、住所録・顧客名簿・ブックマークなどを別のアプリへ移すときの、失敗しにくい順番が分かります。
データのインポートは「書き出す→形式を確かめる→項目を対応付ける→少しだけ試す→全部入れる→数を確かめる」の6段階で進めると、やり直しが少なくなります。いきなり全件を入れると、文字化けしたデータが何千件も登録されてから気づくことになります。
- 1前のアプリでエクスポートする形式(CSV・vCard・JSON・HTML)と文字コードの選択肢があれば控えておく
- 2取り込む側が受け付ける形式を確かめる「CSV(UTF-8)」「vCard 3.0」など、版と文字コードまで見る
- 3ファイルの中身を確かめる文字コード・区切り・見出し行・改行入りのセルの有無
- 4項目を対応付ける「氏名」→name のように、列と取り込み先の項目を1つずつ合わせる
- 5数件だけ試しに入れる漢字・先頭の0・日付・改行が崩れていないかを画面で見る
- 6全件を入れて、件数を比べる元のファイルの行数と、取り込み後の件数が合うか
上書きを伴うインポート(同じ ID のデータを更新する)なら、2の前に取り込み先のバックアップ(エクスポート)を取っておきます。インポートは元に戻すボタンが無いアプリも多く、戻せる手段を先に用意しておくのが安全です。
ファイルの中身を確かめるコマンド
Linux や Mac のターミナル、Windows の Git Bash や WSL では、file コマンドで文字コードの見当が付きます。5種類のファイルを調べた結果です。
$ file *.csv *.tsv
members_bom.csv: CSV Unicode text, UTF-8 (with BOM) text
members_semicolon.csv: Unicode text, UTF-8 text, with CRLF, LF line terminators
members_sjis.csv: CSV Non-ISO extended-ASCII text
members_utf8.csv: CSV Unicode text, UTF-8 text
members_tab.tsv: Unicode text, UTF-8 text, with CRLF, LF line terminators
「UTF-8 (with BOM)」は先頭に BOM(ファイルの先頭に付く目印のバイト)がある UTF-8、「Non-ISO extended-ASCII」は UTF-8 ではない日本語の文字コード(多くは Shift_JIS)であることを示しています。セミコロン区切りとタブ区切りは CSV と判定されず、ただの「Unicode text」と出ました。
CSVのインポートで失敗する原因(文字化け・区切り・先頭の0)
この節では、CSV の取り込みでよく起きる失敗を、実際に再現したエラー原文と表示で確かめられます。
CSV の失敗はほとんどが「文字コード」「BOM」「区切り文字」「改行入りのセル」「先頭の0」「日付の自動変換」「項目名の違い」の7つです。同じ名簿を5種類のファイルにし、Python で読んだ結果を順に示します。
1. 文字コードが違う(UnicodeDecodeError・文字化け)
Shift_JIS のファイルを UTF-8 として読むと、Python はエラーで止まります。読み込みを止めずに置き換え文字で続けると、いわゆる文字化けになります。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
UnicodeDecodeError: 'cp932' codec can't decode byte 0x8e in position 76: illegal multibyte sequence
UTF-8 を cp932 として表示 → 莨壼藤逡ェ蜿キ,豌丞錐,驛オ萓ソ逡
Shift_JIS を UTF-8 として表示 → ����ԍ�,����,�X�֔ԍ�
「莨壼藤」のような見慣れない漢字が並ぶのは UTF-8 を Shift_JIS として読んだとき、「�」が並ぶのは Shift_JIS を UTF-8 として読んだときの典型です。化け方を見れば、どちら向きの取り違えかが分かります。直し方は、取り込む側で文字コードを指定することです。
import csv
# Shift_JIS(Windows の日本語)なら cp932 を指定する
rows = list(csv.reader(open("members_sjis.csv", encoding="cp932", newline="")))
2. BOM付きで、1列目の名前が一致しない(KeyError)
BOM付き UTF-8 を普通の utf-8 で読むと、文字化けはしませんが、1列目の見出しの前に見えない文字 が付きます。見た目は「会員番号」なのに、その名前で取り出せません。
['会員番号', '氏名']
KeyError: '会員番号'
# utf-8-sig は BOM があれば外し、無ければそのまま読む
r = csv.DictReader(open("members_bom.csv", encoding="utf-8-sig", newline=""))
print(r.fieldnames[:2], next(r)["会員番号"])
# ['会員番号', '氏名'] 00123
3. 区切り文字が違う(全部が1列になる)
セミコロン区切りのファイルをカンマ区切りとして読むと、1行がまるごと1列になります。欧州の地域設定で作られた CSV では、カンマの代わりにセミコロンが使われていることがあります。
1 列: ['会員番号;氏名;郵便番号;電話;登録日;メモ']
Python の csv.Sniffer で区切りを推定すると、セミコロンは ';'、タブ区切りは '\t' と判定されました。推定はあくまで推定なので、取り込みの設定で明示するのが確実です。
4. セルの中の改行で、行数がずれる
「住所変更あり(改行)再送済み」のように、引用符で囲まれたセルの中に改行がある場合、1行ずつ分割する手作りの処理では行が増えます。
splitlines で数えると 5 行に見える
各行のカンマの数 [5, 5, 5, 0, 5] ← 4行目は改行の続きでカンマが無い
csv モジュール: 4 行 住所変更あり⏎再送済み "至急"の連絡
CSV は「行=改行」ではありません。引用符で囲んだセルの中には改行もカンマも引用符("" と2つ重ねる)も入れられます。CSV 専用の読み込み部品(Python の csv モジュール、表計算ソフトの CSV の取り込み)を使えば正しく4件になります。Python では open() に newline="" を付けるのが公式ドキュメントの決まりです。
5〜6. 先頭の0が消える・日付に変わる
会員番号「00123」、郵便番号「0600001」、電話番号「09012345678」は、数値として取り込まれると先頭の0が消えます。「1-2」のような文字は、設定によっては日付(1月2日)に変わります。表計算ソフトでの再現は、この節の後半で比べます。
7. 項目名が違う(KeyError と対応表)
取り込む側が name という項目を期待しているのに、ファイルの見出しが「氏名」だと、その項目は見つかりません。
KeyError: 'name'
対応表で変換: 山田 太郎
mapping = {"会員番号": "id", "氏名": "name", "郵便番号": "zip",
"電話": "tel", "登録日": "joined", "メモ": "memo"}
row = {mapping[k]: v for k, v in next(csv.DictReader(f)).items()}
アプリのインポート画面にある「項目の割り当て」「フィールドのマッピング」は、この対応表を画面で作る機能です。
LibreOfficeでCSVをインポートする設定の比較
この節では、表計算ソフトで CSV を開くときの設定(文字コード・列の型・特殊な数値の検出)によって、取り込み結果がどう変わるのかが分かります。
同じ Shift_JIS の CSV を、LibreOffice の設定を変えて4回取り込み、UTF-8 の CSV に書き出して比べました。設定は LibreOffice ヘルプの「CSV フィルターのオプション」の書き方で、コマンドから指定しています。
LO="soffice -env:UserInstallation=file:///dev/shm/t179/lo/profile --headless"
# B:文字コードを Shift-JIS(64)にして読む。列の型は標準
$LO --infilter="CSV:44,34,64,1" \
--convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1" --outdir B members_sjis.csv
# C:1〜6列目をすべて文字列(2)として読む
$LO --infilter="CSV:44,34,64,1,1/2/2/2/3/2/4/2/5/2/6/2" \
--convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1" --outdir C members_sjis.csv
数字の意味は、44=カンマ、34=ダブルクォート、64=Shift-JIS、76=UTF-8、1=1行目から読む、です。5番目の「1/2/2/2…」は「1列目を書式2(テキスト)、2列目を書式2…」という列ごとの指定です。
| 設定 | 会員番号 | 電話 | 「1-2」 | 漢字 |
|---|---|---|---|---|
| A:文字コードを UTF-8 と誤指定 | 123 | 9012345678 | 1-2 | 文字化け(���ԍ�) |
| B:Shift-JIS・列は標準 | 123(0が消える) | 9012345678 | 1-2 | 正しい |
| C:Shift-JIS・全列テキスト | 00123 | 09012345678 | 1-2 | 正しい |
| D:特殊な数値を検出する | 123 | 9012345678 | Jan 02(日付に変換) | 正しい |
Dの設定では、登録日の「2026/10/01」も「Oct 01」という日付の表示に変わって書き出されました。B の実際の出力は次のとおりで、改行入りのメモと "" の引用符は正しく保たれています。
"会員番号","氏名","郵便番号","電話","登録日","メモ"
123,"山田 太郎",600001,9012345678,"2026/10/01","初回"
124,"佐藤 花子",1000005,312345678,"2026/10/02","住所変更あり
再送済み"
125,"髙橋 一郎",5300001,661234567,"1-2","""至急""の連絡"
数値として取り込んでよい列
金額・数量・点数など、足し算や平均を取る列
先頭が0になることが無い列
桁数が15桁以下の列
文字列として取り込む列
会員番号・郵便番号・電話番号・商品コード
「1-2」「3/4」など日付に見える記号を含む列
計算に使わない ID 全般
1回の変換にかかった時間は、2回目以降で約0.3秒(real 0m0.283s)でした。数千行の名簿なら、待ち時間より設定の確認に時間をかけたほうが結果に効きます。表計算ソフトの CSV で起きる文字化けの直し方は、関連記事「PythonでCSVを読み書き|コピペ用テンプレートと文字化け対策」で扱っています。
データベースへのインポート(列数・型・重複・速さ)
この節では、CSV をデータベースの表に入れるときに出るエラーと、速く入れる方法が実測で分かります。
データベースへのインポートでは、「列の数」「列の型」「重複(主キー)」の3つでつまずき、1行ずつ確定(commit)すると極端に遅くなります。Python の sqlite3 モジュール(SQLite 3.53.1)で再現しました。
列の数が合わない
OperationalError: table members has 6 columns but 5 values were supplied
ProgrammingError: Incorrect number of bindings supplied. The current statement uses 3, and there are 2 supplied.
1つ目は表の列数(6)と INSERT の値の数(5)が違うとき、2つ目は ? の数(3)とデータの列数(2)が違うときです。CSV の途中に列の欠けた行が1行あるだけで、2つ目のエラーで止まります。
列の型で、先頭の0が消える
会員番号と郵便番号の列を integer にした表へ入れると、SQLite は数値に変換して保存しました。
(123, 'integer', 600001, 'integer', '09012345678', '2026/10/01')
(124, 'integer', 1000005, 'integer', '0312345678', '2026/10/02')
(125, 'integer', 5300001, 'integer', '0661234567', '1-2')
電話番号の列は text にしていたので「0」が残っています。番号は数値ではなく文字列の列にする、が表の設計の段階でできる一番の予防です。
同じファイルを2回取り込む(重複)
IntegrityError: UNIQUE constraint failed: members.id
主キー(id)があれば、2回目の取り込みはこのエラーで止まり、重複は入りません。意図して上書きしたいときは upsert(あれば更新・無ければ追加)を使います。
insert into members values (?,?,?,?,?,?)
on conflict(id) do update set name = excluded.name;
-- 2回取り込んでも件数は 3 のまま
主キーの無い表では、2回目もエラーにならず、同じ行が2倍に増えます。インポートの前に「この表に一意の列があるか」を確かめておくと、二重登録を防げます。
1行ずつ確定するか、まとめて確定するか(実測)
作業用のディスク上のデータベースに、同じ形の行を入れて速さを比べました(2 CPU のマシン、2回ずつ測定)。
| 入れ方 | 行数 | かかった時間 | 1秒あたり |
|---|---|---|---|
| 1行ごとに commit | 2,000 | 3.282秒/2.154秒 | 約609〜928行 |
| executemany+最後に1回 commit | 100,000 | 0.150秒/0.129秒 | 約67万〜78万行 |
まとめて確定すると、1秒あたりの行数は700倍以上になりました。commit のたびにディスクへの書き込みを確実にする処理が走るためです(メモリ上の /dev/shm で測ると、差は約40倍まで縮みました)。データベースごとの一括取り込み命令は、関連記事「PostgreSQL CSVインポート|COPYと\copyの違いとエラー対処」と「MySQL CSVインポート|LOAD DATA INFILEとエラー解決」で、COPY・LOAD DATA の書き方とエラー別の直し方を扱っています。この記事は「インポートで何が起きるか」の入口、そちらは製品ごとの実装、という役割分けです。
JSONのインポートでよくあるエラー(PythonとNode.js)
この節では、JSON ファイルを取り込むときに出るエラーの原文と、言語による違いが分かります。
JSON は CSV より形が厳密で、末尾のカンマ1つ・シングルクォート1つで読み込みが止まります。4種類の壊れ方のファイルを、Python と Node.js で読みました。
| ファイル | Python 3.13 の原文 | Node.js 22 の原文 |
|---|---|---|
| 末尾のカンマ | Illegal trailing comma before end of array | Unexpected token ']' |
| キーがシングルクォート | Expecting property name enclosed in double quotes | Expected double-quoted property name in JSON |
| 先頭に BOM | Unexpected UTF-8 BOM (decode using utf-8-sig) | Unexpected token ''(見えない BOM の文字) |
| 1行に1件の JSON Lines | Extra data: line 2 column 1 | Unexpected non-whitespace character after JSON |
Python のエラーには行と列(例:line 3 column 26 (char 54))が付くので、エディタでその位置を開けば壊れた箇所が分かります。BOM のときは、Python は直し方(utf-8-sig で読む)までメッセージに書いていました。RFC 8259 は、ネットワークで送る JSON の先頭に BOM を付けてはならない(MUST NOT)と定めています。
import json
json.load(open("bom.json", encoding="utf-8-sig")) # BOM を外して読む
[json.loads(line) for line in open("lines.jsonl")] # JSON Lines は1行ずつ
大きな整数が変わる(エラーにならない失敗)
エラーが出ないぶん気づきにくいのが、桁の大きな数です。同じ {"id": 12345678901234567890} を読むと、結果が分かれました。
Python : {'id': 12345678901234567890}
Node.js: 12345678901234567000
JavaScript の数値は倍精度の浮動小数点数なので、約16桁を超える整数は丸められます。RFC 8259 も、相互運用のために IEEE 754 の倍精度の範囲を意識するよう書いています。注文番号や SNS の ID のような長い番号は、JSON でも文字列("id": "1234…")でやり取りするのが安全です。
vCard(連絡先)とブックマークのインポート
この節では、連絡先の vCard とブラウザのブックマークを取り込むときの、形式と文字コードの注意点が分かります。
vCard の版と文字コード
vCard(.vcf)は連絡先をやり取りする形式で、版によって文字コードの扱いが違います。4.0 は RFC 6350 で文字セットが UTF-8 と決められていて、3.0 も UTF-8 で書き出すアプリが多い一方、以前の携帯電話などが書き出した 2.1 では、Shift_JIS の文字を「QUOTED-PRINTABLE」という形で書く例があります。2種類を作り、読み比べました。
BEGIN:VCARD
VERSION:2.1
N;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=8ER=93c;=91=BE=98Y;;;
TEL;CELL:090-1234-5678
END:VCARD
contact30.vcf {'VERSION': '3.0', 'N': '山田;太郎;;;', 'FN': '山田 太郎', 'TEL': '090-1234-5678', ...}
contact21.vcf {'VERSION': '2.1', 'N(正しい文字コード)': '山田;太郎;;;',
'N(UTF-8と仮定)': '�R�c;���Y;;;', 'TEL': '090-1234-5678'}
2.1 の名前は、CHARSET=SHIFT_JIS を読んで Shift_JIS として戻すと「山田;太郎」になり、UTF-8 と決めつけて戻すと「�R�c」に化けました。電話番号は英数字だけなので、どちらでも崩れません。連絡先を取り込んで名前だけが化けるときは、vCard の版と CHARSET を疑うのが近道です。取り込む側が 2.1 を受け付けない場合は、書き出す側で 3.0 を選べないかを先に確かめます。
ブックマークは HTML ファイルでやり取りする
ブラウザ間のブックマークの移行には、Netscape 形式と呼ばれる HTML ファイルが広く使われます。中身は <DL>(フォルダーの入れ物)、<H3>(フォルダー名)、<A HREF>(ブックマーク)が入れ子になった HTML です。
<!DOCTYPE NETSCAPE-Bookmark-file-1>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<DL><p>
<DT><H3 ADD_DATE="1761696000">仕事</H3>
<DL><p>
<DT><A HREF="https://www.python.org/">Python</A>
<DT><A HREF="https://nodejs.org/">Node.js</A>
</DL><p>
<DT><A HREF="https://www.sqlite.org/">SQLite</A>
</DL><p>
Python の html.parser で読み、フォルダーの入れ子を保ったまま取り出せることを確かめました。
('仕事', 'Python', 'https://www.python.org/')
('仕事', 'Node.js', 'https://nodejs.org/')
('', 'SQLite', 'https://www.sqlite.org/')
Google Chrome ヘルプによると、Windows・Mac の Chrome では、右上の「その他」→「ブックマークとリスト」→「ブックマークと設定をインポート」→「ファイルを選択」で、この HTML ファイルを取り込めます。Chromebook では「ブックマーク マネージャ」の「管理」→「HTML ファイルからブックマークをインポート」です。前のブラウザでは、同じ形式の HTML として書き出しておきます。
プログラミングのimportとは(Python・JavaScript・Java・Go)
この節では、プログラミングの import が何をしているのかと、4つの言語での違いが実行結果で分かります。
プログラミングの import は、別のファイルやライブラリに書かれた関数・クラス・定数を、今のファイルで名前を書くだけで使えるようにする命令です。中身をコピーして貼り付けるのではなく、「どこにある何を使うか」を宣言します。言語によって、実行時に読み込むのか、コンパイル時に名前を解決するだけなのかが違います。
| 言語 | 書き方の例 | import が実際にすること | 使わない import |
|---|---|---|---|
| Python | from shop.calc import price |
実行時にファイルを読み込み、1回だけ実行して保存する | エラーにならない |
| JavaScript(ESM) | import { price } from "./calc.mjs" |
実行前に読み込み、export された名前とつなぐ | エラーにならない |
| Java | import shop.Calc; |
コンパイル時に短い名前で書けるようにするだけ | エラーにならない(警告ツールで検出) |
| Go | import "example.com/shop/calc" |
パッケージをまとめてコンパイルし、名前でつなぐ | コンパイルエラー |
Python:実行時に読み込み、2回目は読み込まない
import math
from shop.calc import price, TAX # shop/calc.py の price と TAX
import shop.calc as c # 別名を付ける
print(price(1000), TAX, c.__name__, math.sqrt(2))
import sys; print("shop" in sys.modules, "shop.calc" in sys.modules)
1100 0.1 shop.calc 1.4142135623730951
True True
Python は、import したモジュールを sys.modules に保存し、同じ import をもう一度書いても読み込み直しません。print だけを書いた once.py を2回 import し、そのあと importlib.reload で読み直すと、表示は2回でした。1回目の import と reload の分で、2回目の import では何も表示されていません。
import once # 1回目:once.py が実行される
import once # 2回目:何も起きない
import importlib, once as o
importlib.reload(o) # 明示的に読み直す
once.py を読み込みました
once.py を読み込みました
初回の読み込みにかかる時間は python3 -X importtime で測れます。標準ライブラリを5回ずつ測ると、累計で csv が約6ミリ秒、json が約7〜10ミリ秒、sqlite3 が約4ミリ秒でした。一方、読み込み済みのモジュールをもう一度 import する文は、timeit で1回あたり78.2ナノ秒でした。
JavaScript:export された名前だけを import できる
// calc.mjs
export const TAX = 0.1;
export function price(x) { return Math.trunc(x * (1 + TAX)); }
export default "calc";
// main.mjs
import name, { price, TAX } from "./calc.mjs";
import * as all from "./calc.mjs";
console.log(price(1000), TAX, name, Object.keys(all));
const m = await import("./calc.mjs"); // 動的 import
console.log("dynamic:", m.price(500));
1100 0.1 calc [ 'TAX', 'default', 'price' ]
dynamic: 550
JavaScript では、export と import が対になっています。エクスポートとインポートの関係が、言語の文法そのものになっている例です。ESM と CommonJS(require)の違いは、関連記事「JavaScript import/export入門|ESMとCommonJSの違い」で詳しく扱っています。
Java:import はクラス名を短く書くための宣言
import java.util.List;
import shop.Calc;
import static shop.Calc.price; // static メンバーを名前だけで呼ぶ
public class Main {
public static void main(String[] a) {
System.out.println(price(1000) + " " + Calc.TAX + " " + List.of(1, 2));
System.out.println(new java.util.ArrayList<String>().getClass().getName());
}
}
1100 0.1 [1, 2]
java.util.ArrayList
2行目の java.util.ArrayList は import せずに完全な名前で書いても動いています。Java の import は「ファイルを読み込む」命令ではなく、java.util.List を List と短く書けるようにする宣言です。クラスを実際に探すのは、コンパイルと実行のときのクラスパスです。
Go:使わない import はコンパイルエラー
package main
import (
"fmt"
"strings"
"example.com/shop/calc"
)
func main() {
fmt.Println(calc.Price(1000), calc.Tax, strings.ToUpper("go"))
}
1100 0.1 GO
Go では、import したパッケージを使わないとコンパイルが通りません。副作用(初期化)だけが目的のパッケージは、import _ "パッケージ名" と空白識別子で書きます。また、大文字で始まる名前(Price・Tax)だけがパッケージの外から使えます。
importのエラー原文と直し方(4言語)
この節では、import で出るエラーを言語ごとに原文で確かめ、どこを直せばよいかが分かります。
import のエラーは「見つからない(名前・場所の違い)」「中に無い(綴り・公開範囲)」「使っていない(Go)」「書き方の種類が違う(JavaScript)」の4系統です。
| 言語 | エラー原文 | 起きた状況 | 直し方 |
|---|---|---|---|
| Python | ModuleNotFoundError: No module named 'pandaz' | パッケージ名の綴り違い・未インストール | 綴りと、今の Python に pip で入っているかを確かめる |
| Python | ModuleNotFoundError: No module named 'shop' | 別のフォルダーから実行した | プロジェクトのフォルダーで実行する・パッケージとして入れる |
| Python | ImportError: cannot import name 'prise' from 'shop.calc' | モジュールの中に無い名前 | 綴りを直す。循環 import の可能性も見る |
| JavaScript | Error [ERR_MODULE_NOT_FOUND]: Cannot find module | ESM で拡張子を省いた(./calc) | ./calc.mjs のように拡張子まで書く |
| JavaScript | SyntaxError: The requested module './calc.mjs' does not provide an export named 'prise' | export されていない名前 | 相手の export の名前と合わせる |
| JavaScript | SyntaxError: Cannot use import statement outside a module | "type": "commonjs" の .js で import を書いた | .mjs にする・"type": "module" にする |
| Java | error: cannot find symbol(symbol: variable List) | import を書かずに List を使った | import java.util.List; を足す |
| Java | error: package shop does not exist | shop のクラスをコンパイル対象・クラスパスに入れていない | -cp や -sourcepath を見直す |
| Go | "strings" imported and not used | import したが使っていない | import を消す(エディタの自動整形でも消える) |
| Go | undefined: calc.helper | 小文字で始まる非公開の名前を外から呼んだ | 大文字の名前にして公開する |
| Go | no required module provides package …; to add it: go get … | go.mod に無いモジュール・パスの綴り違い | 綴りを直す・go get で go.mod に足す |
Node.js 22 では、package.json の書き方で結果が変わった
拡張子 .js のファイルに import を書いて実行すると、package.json が無い状態では普通に動き(出力 1)、"type": "commonjs" を書いた package.json を置くとエラーになりました。
$ node cjs.js # package.json なし
1
$ echo '{"type":"commonjs"}' > package.json && node cjs.js
SyntaxError: Cannot use import statement outside a module
Node.js 公式ドキュメントによると、type の指定が無い .js は「あいまいな入力」として中身を調べ、ESM の構文があれば ES モジュールとして扱います(Syntax detection。v22.7.0 で既定で有効)。同じコードが、Node.js の版と package.json の有無で動いたり動かなかったりするのはこのためです。
Python の ImportError と循環 import
cannot import name は、綴りの違いのほかに、2つのファイルがお互いを import し合っている(循環 import)ときにも出ます。原因の見分け方と直し方は、関連記事「cannot import nameの直し方|Pythonの循環インポート」で扱っています。自作モジュールの置き場所や sys.path の考え方は、関連記事「Python importの使い方|自作モジュールとエラー対処」が詳しい入口です。
インポートでよくあるエラー・つまずき一覧
この節では、データとプログラムの両方について、症状から原因と直し方を引ける一覧が分かります。
| 症状 | 表示・原文の例 | 原因 | 直し方 |
|---|---|---|---|
| 漢字が見慣れない漢字になる | 莨壼藤逡ェ蜿キ | UTF-8 を Shift_JIS として読んだ | 取り込む側で UTF-8 を指定 |
| 漢字が � や記号になる | ����ԍ� | Shift_JIS を UTF-8 として読んだ | Shift_JIS(cp932)を指定 |
| 1列目だけ名前で取れない | KeyError: '会員番号' | BOM が見出しに付いた | utf-8-sig で読む |
| 全部が1列に入る | 1 列: ['会員番号;氏名;…'] | 区切り文字の違い | 区切りをセミコロン・タブに設定 |
| 行数が増える・列がずれる | カンマの数 [5, 5, 5, 0, 5] | セルの中の改行を行と数えた | CSV 専用の読み込み部品を使う |
| 番号の先頭の0が消える | 00123 → 123 | 数値として取り込んだ | 列を文字列(テキスト)に設定 |
| 記号が日付に変わる | 1-2 → Jan 02 | 特殊な数値の自動検出 | 検出を切る・列を文字列に |
| 同じデータが2倍になる | (エラーなし) | 主キーの無い表に2回取り込んだ | 主キーを付ける・upsert を使う |
| 長い番号の末尾が000になる | 12345678901234567000 | JavaScript の数値の精度 | 番号は JSON でも文字列にする |
| 連絡先の名前だけ化ける | �R�c;���Y | vCard 2.1 の Shift_JIS | 3.0 で書き出し直す・CHARSET を読む |
| プログラムで名前が見つからない | No module named / Cannot find module | 綴り・場所・未インストール | 前の節の表で言語別に確かめる |
インポート前の確認リストと判断表
この節では、データを取り込む前に確かめることと、方法の選び方が分かります。
- 1取り込み先のバックアップを取った上書きのあるインポートは、元に戻せないアプリが多い
- 2ファイルの文字コードと BOM の有無を確かめたfile コマンドやエディタの右下の表示で分かる
- 3区切り文字と見出し行の有無を確かめたカンマ・セミコロン・タブ。1行目が見出しかデータか
- 4番号の列を文字列として取り込む設定にした会員番号・郵便番号・電話番号・商品コード
- 5項目の対応表を作った「氏名」→name のように、列と項目を1つずつ合わせる
- 6重複の扱い(止める・上書き・追加)を決めた主キーの有無で、2回目の取り込みの結果が変わる
- 7数件で試し、件数と中身を比べた元の行数と取り込み後の件数、漢字・0・日付・改行
どの方法でインポートするかの判断表
| 状況 | 向いている方法 | 理由 |
|---|---|---|
| 一度きり・数百件まで | アプリのインポート画面 | 項目の対応を画面で確かめながら進められる |
| 中身を見て直してから入れたい | LibreOffice などで開き、列を文字列にして確かめる | 化け・0の欠け・日付の変換を目で見つけやすい |
| 毎日・毎週くり返す | Python などのスクリプト | 文字コード・対応表・重複の扱いを固定して再現できる |
| 数十万行以上をデータベースへ | DB の一括取り込み命令(COPY・LOAD DATA) | 1行ずつの INSERT より桁違いに速い |
| 連絡先・ブックマークの移行 | vCard 3.0・ブックマーク HTML で書き出して取り込む | どのアプリでも受け付けられやすい標準の形式 |
| 機密情報を含むファイル | 手元のアプリ・スクリプトで変換する | 変換のために外部のサービスへ上げずに済む |
よくある質問
この節では、インポートについてよく調べられる疑問への短い答えが分かります。
Q. インポートとは簡単に言うと何ですか?
外にあるデータや機能を、今使っているアプリやプログラムの中に取り込むことです。貿易では輸入の意味です。
Q. インポートとエクスポートはどちらが先ですか?
データを別のアプリへ移すときは、前のアプリでエクスポート(書き出し)してから、新しいアプリでインポート(取り込み)します。
Q. インポートすると元のファイルは消えますか?
通常は消えません。ファイルを読んで中身を登録するだけなので、元のファイルはそのまま残ります。取り込み先の既存データが上書きされることはあるため、上書きのある取り込みの前はバックアップを取ります。
Q. 「インポート品」と「並行輸入品」は違いますか?
インポート品は輸入品全般を指す言い方です。並行輸入品は、正規の代理店とは別の経路で輸入された品物を指します。
Q. CSV をインポートしたら文字化けしました。
文字コードの取り違えです。見慣れない漢字なら UTF-8 を Shift_JIS として、「�」なら Shift_JIS を UTF-8 として読んでいます。取り込む側の文字コードの設定を変えて読み直します。
Q. 郵便番号や電話番号の先頭の0が消えるのはなぜですか?
数値として取り込まれたためです。表計算ソフトやデータベースで、その列を文字列(テキスト)として取り込む設定にすると残ります。
Q. プログラミングの import と include は同じですか?
C 言語の #include はファイルの中身をその場に貼り込む仕組みで、Python や Java の import は名前を参照できるようにする仕組みです。目的は近いものの、動きは違います。
Q. Python で同じモジュールを2回 import すると遅くなりますか?
2回目は読み込み済みのものを使うので、ほとんど時間はかかりません。測定では1回あたり78.2ナノ秒でした。
Q. Go で使わない import がエラーになるのはなぜですか?
Go は不要な依存をコンパイル時に禁止する言語の決まりがあるためです。副作用だけが目的なら import _ "パッケージ名" と書きます。
Q. インポートとダウンロードの違いは何ですか?
ダウンロードはファイルを手元に受け取るだけです。インポートは、そのファイルを読んでアプリの中のデータとして登録するところまでを指します。
まとめ
この節では、インポートについて押さえておきたい点を5つに絞って振り返ります。
- インポートは「外から中へ取り込む」こと。貿易では輸入、アプリではデータの取り込み、プログラミングでは機能を使えるようにする命令。
- エクスポートと対になる。前のアプリで書き出し、新しいアプリで取り込む。件数と中身の要約を比べると、欠けや化けに気づける。
- CSV の失敗は7つにまとまる。文字コード・BOM・区切り・改行入りのセル・先頭の0・日付の自動変換・項目名の違い。
- データベースでは列の型・重複・確定の回数に注意。番号は文字列の列に、主キーで重複を止め、まとめて commit すると1秒あたりの行数が700倍以上になった。
- プログラミングの import は言語で動きが違う。Python は実行時に1回読み込み、Java は名前を短くするだけ、Go は使わないとエラー、JavaScript は export と対。
参考・出典
この節では、この記事で確かめた公式の資料が分かります(確認日 2026年10月29日)。
- 関税法(昭和二十九年法律第六十一号)第2条:日本法令外国語訳データベース https://www.japaneselawtranslation.go.jp/ja/laws/view/3510
- 税関「1101 輸入通関手続の概要(カスタムスアンサー)」 https://www.customs.go.jp/tetsuzuki/c-answer/imtsukan/1101_jr.htm
- Google Chrome ヘルプ「ブックマークをインポートする」 https://support.google.com/chrome/answer/96816?hl=ja
- LibreOffice Help「CSV Filter Options」 https://help.libreoffice.org/latest/en-US/text/shared/guide/csv_params.html
- RFC 8259「The JavaScript Object Notation (JSON) Data Interchange Format」 https://www.rfc-editor.org/rfc/rfc8259
- RFC 4180「Common Format and MIME Type for Comma-Separated Values (CSV) Files」 https://www.rfc-editor.org/rfc/rfc4180
- RFC 6350「vCard Format Specification」 https://www.rfc-editor.org/rfc/rfc6350
- Python ドキュメント「csv --- CSV ファイルの読み書き」 https://docs.python.org/ja/3/library/csv.html
- Python ドキュメント「インポートシステム」 https://docs.python.org/ja/3/reference/import.html
- Node.js Documentation「Modules: Packages(Syntax detection)」 https://nodejs.org/api/packages.html
- The Java Language Specification「7.5. Import Declarations」 https://docs.oracle.com/javase/specs/jls/se21/html/jls-7.html#jls-7.5
- The Go Programming Language Specification「Import declarations」 https://go.dev/ref/spec#Import_declarations
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「インポートとは|エクスポートとの違いと取り込みの失敗例」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。