無料マクロリファレンステーブル:完全な栄養データをCSVおよびJSON形式でダウンロード
500以上の一般的な食品の完全な栄養データをCSVおよびJSON形式でダウンロードできます。食品カテゴリごとに整理されたタンパク質、炭水化物、脂肪、食物繊維、カロリーを含みます。
栄養アプリを構築している場合や、研究を行っている場合、クライアントを指導している場合、あるいはデスクに信頼できるリファレンスシートを置きたい場合でも、実際に利用できる形式でクリーンなマクロデータが必要です。政府のデータベースは存在しますが、広範で一貫性がなく、ビルダーよりも官僚向けにフォーマットされています。
私たちは、500以上の一般的な食品の完全なマクロ栄養素の内訳をカバーする無料のマクロリファレンステーブルを用意しました。データはCSVおよびJSON形式で利用可能で、スプレッドシート、データベース、スクリプト、アプリケーションに直接取り込むことができます。すべてのエントリは一次資料に基づいて検証されており、ファイルはクリーンアップや変換なしですぐに使用できるように構成されています。
このページでは、テーブルに含まれる内容、データの構造、プログラム的な読み込み方法、修正が必要な場合の貢献方法について詳しく説明します。
含まれている内容
マクロリファレンステーブルには、7つの主要カテゴリにわたる500以上の一般的に消費される食品が含まれています。各食品項目には以下の情報が含まれています:
- 食品名 — 栄養科学で使用される標準的な英語名
- カテゴリ — 7つのトップレベルカテゴリのいずれか(詳細は以下)
- サブカテゴリ — 親カテゴリ内のより具体的なグループ
- サービングサイズの説明 — 人間が読みやすいサービングサイズ(例:「中サイズのバナナ1本」、「調理済み1カップ」)
- サービング重量(グラム) — そのサービングサイズのグラム換算
- カロリー — 総エネルギー(キロカロリー)
- タンパク質 — サービングあたりのタンパク質(グラム)
- 総脂肪 — サービングあたりの総脂肪(グラム)
- 飽和脂肪 — サービングあたりの飽和脂肪(グラム)
- 総炭水化物 — サービングあたりの総炭水化物(グラム)
- 食物繊維 — サービングあたりの食物繊維(グラム)
- 糖 — サービングあたりの総糖(グラム)
- ナトリウム — サービングあたりのナトリウム(ミリグラム)
すべての値は、リストされたサービングサイズに基づいて報告されており、100グラムあたりではありません。このアプローチを選んだ理由は、サービングベースのデータが、食事を追跡したり、食事プランを作成したり、インターフェースに栄養情報を表示したりする際に、ほとんどの人が実際に必要とする情報だからです。100グラムあたりの値が必要な場合は、サービング重量で割り、100を掛けるのは簡単です。
テーブルには、ナトリウムと食物繊維を超える微量栄養素は含まれていません。完全な微量栄養素プロファイル(ビタミン、ミネラル、アミノ酸)については、この記事の最後にあるNutrolaのAPIのセクションをご覧ください。詳細なデータがそこにあります。
データ形式の仕様
CSV形式
CSVファイルはUTF-8エンコーディングを使用し、ヘッダー行があります。フィールドはカンマで区切られ、テキストフィールドは引用符で囲まれています。構造は以下のようになります:
food_name,category,subcategory,serving_description,serving_weight_g,calories_kcal,protein_g,total_fat_g,saturated_fat_g,total_carbs_g,fiber_g,sugar_g,sodium_mg
"鶏むね肉(皮なし)、調理済み","タンパク質","家禽","1胸(170g)",170,284,53.4,6.2,1.7,0.0,0.0,0.0,126
"アトランティックサーモン、調理済み","タンパク質","魚介類","1フィレ(154g)",154,280,39.3,12.4,2.5,0.0,0.0,0.0,109
"玄米、調理済み","穀物・デンプン","全粒穀物","1カップ(195g)",195,216,5.0,1.8,0.4,44.8,3.5,0.7,10
"バナナ、生","果物","熱帯果物","中サイズ1本(118g)",118,105,1.3,0.4,0.1,27.0,3.1,14.4,1
CSVファイルはMicrosoft Excel、Google Sheets、LibreOffice Calc、Apple Numbers、CSV解析サポートのある任意のプログラミング言語と互換性があります。特別な設定は不要で、ファイルを開くだけで正しく解析されます。
JSON形式
JSONファイルには、食品項目ごとに1つのオブジェクトの配列が含まれています。構造はCSVフィールドに対応しています:
{
"version": "1.4.0",
"generated": "2026-03-12",
"source": "Nutrola Macro Reference Tables",
"record_count": 527,
"foods": [
{
"food_name": "鶏むね肉(皮なし)、調理済み",
"category": "タンパク質",
"subcategory": "家禽",
"serving_description": "1胸(170g)",
"serving_weight_g": 170,
"nutrients": {
"calories_kcal": 284,
"protein_g": 53.4,
"total_fat_g": 6.2,
"saturated_fat_g": 1.7,
"total_carbs_g": 0.0,
"fiber_g": 0.0,
"sugar_g": 0.0,
"sodium_mg": 126
}
}
]
}
JSONファイルには、上位レベルにメタデータフィールドが含まれています:更新を追跡するためのバージョン文字列、生成日、ソース名、総レコード数。これにより、最新のバージョンを確認し、アプリケーションに更新チェックロジックを組み込むのが簡単になります。
数値は文字列ではなく数値として保存されます。ヌル値は表示されず、栄養素の値が不明な場合、その食品はデータセットから除外されます。この選択は、データをクリーンに保ち、計算での静かなエラーを避けるためのものです。
フィールドの説明
各フィールドの詳細な内訳、単位、期待される範囲、エッジケースは以下の通りです:
| フィールド | 型 | 単位 | 説明 |
|---|---|---|---|
| food_name | 文字列 | — | 標準的な英語名。関連する場合は調理方法を含む(例:「調理済み」、「生」、「乾燥」)。 |
| category | 文字列 | — | 7つのトップレベルカテゴリのいずれか。以下のカテゴリセクションを参照。 |
| subcategory | 文字列 | — | より具体的なグループ。例えば、「タンパク質」内には「家禽」、「赤肉」、「魚介類」、「豆類」、「卵」が含まれます。 |
| serving_description | 文字列 | — | 人間が読みやすいサービングサイズ。常にグラム重量を括弧内に含む。 |
| serving_weight_g | 数値 | グラム | サービングの数値グラム重量。ほとんどの項目は整数値、精度が重要な項目は小数点以下1桁。 |
| calories_kcal | 数値 | kcal | 総エネルギー。アトウォーターシステムを使用して計算(タンパク質4 kcal/g、炭水化物4 kcal/g、脂肪9 kcal/g)。 |
| protein_g | 数値 | グラム | 総タンパク質。小数点以下1桁の精度。 |
| total_fat_g | 数値 | グラム | 飽和脂肪、一価不飽和脂肪、多価不飽和脂肪を含む総脂肪。 |
| saturated_fat_g | 数値 | グラム | 飽和脂肪酸のみ。 |
| total_carbs_g | 数値 | グラム | 食物繊維と糖を含む総炭水化物。 |
| fiber_g | 数値 | グラム | 総食物繊維(可溶性+不溶性)。 |
| sugar_g | 数値 | グラム | 総糖(自然発生+添加)。データセットは添加糖と自然糖を区別しません。 |
| sodium_mg | 数値 | ミリグラム | ナトリウム含量。これはミリグラムであり、他の栄養素フィールドとは異なりグラムではありません。 |
精度に関するいくつかの注意点:すべての栄養素値は小数点以下1桁に丸められています。これは、基礎となるソースデータの精度レベルに一致します。より多くの小数点以下の桁を報告することは、誤った精度レベルを示唆することになります — 食品成分は、栽培条件、動物の品種、調理方法によって自然に5-15%変動します。
食品カテゴリ
500以上の食品は、7つのトップレベルカテゴリに整理されており、それぞれに複数のサブカテゴリがあります:
タンパク質
約95のエントリがあり、家禽(鶏むね肉、もも肉、七面鳥、挽き肉)、赤肉(牛サーロイン、さまざまな脂肪率の挽き肉、豚ロース、羊肉)、魚介類(サーモン、ツナ、エビ、タラ、ティラピア、イワシ)、卵(全卵、卵白、スクランブル)、植物性タンパク質(豆腐、テンペ、セイタン、枝豆)が含まれています。豆類(レンズ豆、ひよこ豆、黒豆)は、主にタンパク質の供給源であるため、穀物ではなくここに含まれています。
穀物とデンプン
約80のエントリがあり、全粒穀物(玄米、オートミール、キヌア、大麦、ブルグル)、精製穀物(白米、白パン、パスタ)、デンプン質の野菜(ジャガイモ、サツマイモ、トウモロコシ)、一般的な穀物製品(トルティーヤ、ベーグル、クラッカー、クスクス)が含まれています。穀物に関しては、調理済みと乾燥の値が提供されているものもあります。
果物
約65のエントリがあり、一般的な生の果物(リンゴ、バナナ、オレンジ、イチゴ、ブルーベリー、ブドウ)、熱帯果物(マンゴー、パイナップル、パパイヤ、キウイ)、乾燥果物(レーズン、デーツ、乾燥アプリコット、クランベリー)、冷凍果物が含まれています。すべての生果物のエントリは、食用部分の生の重量に基づいており、種、皮、核は該当する場合はサービング重量に含まれません。
野菜
約85のエントリがあり、葉物野菜(ほうれん草、ケール、ロメイン、ルッコラ)、アブラナ科の野菜(ブロッコリー、カリフラワー、芽キャベツ、キャベツ)、根菜(ニンジン、ビーツ、カブ、ラディッシュ)、ネギ類(タマネギ、ニンニク)、ナス科(トマト、ピーマン、ナス)、その他の一般的な野菜(キュウリ、セロリ、ズッキーニ、キノコ、アスパラガス)が含まれています。調理が栄養密度に大きく影響する場合、野菜については生と調理済みの値が提供されています。
乳製品と代替品
約70のエントリがあり、牛乳(全乳、2%、無脂肪、植物性ミルク)、ヨーグルト(ギリシャ、通常、フレーバー付き、植物性)、チーズ(チェダー、モッツァレラ、フェタ、カッテージチーズ、クリームチーズ、パルメザン)、バター、クリーム、一般的な乳製品の代替品(アーモンドミルク、オートミルク、大豆ミルク、ココナッツヨーグルト)が含まれています。植物性ミルクとヨーグルトは、通常直接の代替品として利用されるため、別のカテゴリではなくここにグループ化されています。
スナックと加工食品
約75のエントリがあり、ナッツと種子(アーモンド、クルミ、ピーナッツ、チアシード、フラックスシード、ひまわりの種)、ナッツバター(ピーナッツバター、アーモンドバター)、一般的なスナック食品(プレッツェル、ポップコーン、グラノーラバー、プロテインバー、トレイルミックス、チップス、ダークチョコレート)、スプレッドや調味料(フムス、グアカモレ、サルサ、マヨネーズ、オリーブオイル、ハチミツ)、プロテインパウダーやエナジーバイトなどの一般的に追跡されるアイテムが含まれています。
飲料
約60のエントリがあり、ジュース(オレンジジュース、アップルジュース、クランベリージュース)、ソフトドリンク(コーラ、レモンライムソーダ、ジンジャーエール)、スポーツドリンクやエナジードリンク、コーヒー飲料(ブラックコーヒー、ラテ、カプチーノ、モカ)、スムージーのベース、アルコール飲料(ビール、ワイン、スピリッツ)、一般的な追加物(クリーム、砂糖、フレーバーシロップ)が含まれています。水は栄養素が含まれていないため含まれていません。
データをプログラム的に使用する
CSVおよびJSON形式でデータを提供する目的は、このデータを直接コードに読み込むことができるようにすることです。以下にPythonとJavaScriptの作業例を示します。
Python:CSVの読み込み
import csv
def load_macro_table(filepath):
foods = []
with open(filepath, newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
# 数値フィールドを文字列から変換
for key in ['serving_weight_g', 'calories_kcal', 'protein_g',
'total_fat_g', 'saturated_fat_g', 'total_carbs_g',
'fiber_g', 'sugar_g', 'sodium_mg']:
row[key] = float(row[key])
foods.append(row)
return foods
foods = load_macro_table('macro_reference_table.csv')
# カテゴリ内のすべての食品を見つける
proteins = [f for f in foods if f['category'] == 'タンパク質']
print(f"タンパク質源を{len(proteins)}件見つけました")
# カロリーあたりのタンパク質が最も多い食品を見つける
foods_sorted = sorted(foods, key=lambda f: f['protein_g'] / max(f['calories_kcal'], 1), reverse=True)
print("\nカロリーあたりのタンパク質密度が高いトップ10食品:")
for f in foods_sorted[:10]:
ratio = f['protein_g'] / f['calories_kcal']
print(f" {f['food_name']}: {ratio:.3f} g/kcal ({f['protein_g']}g タンパク質, {f['calories_kcal']} kcal)")
Python:JSONの読み込み
import json
def load_macro_json(filepath):
with open(filepath, encoding='utf-8') as f:
data = json.load(f)
print(f"{data['record_count']}件の食品を読み込みました(バージョン {data['version']})")
return data['foods']
foods = load_macro_json('macro_reference_table.json')
# 食品名によるルックアップ辞書を作成
lookup = {f['food_name'].lower(): f for f in foods}
# クイックルックアップ
chicken = lookup.get('鶏むね肉(皮なし)、調理済み')
if chicken:
n = chicken['nutrients']
print(f"鶏むね肉のサービングあたり({chicken['serving_description']}):")
print(f" カロリー: {n['calories_kcal']} kcal")
print(f" タンパク質: {n['protein_g']}g")
print(f" 脂肪: {n['total_fat_g']}g")
print(f" 炭水化物: {n['total_carbs_g']}g")
JavaScript:JSONの読み込み
// Node.js
const fs = require('fs');
function loadMacroTable(filepath) {
const raw = fs.readFileSync(filepath, 'utf-8');
const data = JSON.parse(raw);
console.log(`Loaded ${data.record_count} foods (version ${data.version})`);
return data.foods;
}
const foods = loadMacroTable('macro_reference_table.json');
// カテゴリごとに食品をグループ化
const byCategory = {};
for (const food of foods) {
if (!byCategory[food.category]) {
byCategory[food.category] = [];
}
byCategory[food.category].push(food);
}
// サマリーを表示
for (const [category, items] of Object.entries(byCategory)) {
console.log(`${category}: ${items.length} foods`);
}
// 低カロリーで高食物繊維の食品を見つける
const highFiber = foods
.filter(f => f.nutrients.fiber_g >= 5 && f.nutrients.calories_kcal <= 200)
.sort((a, b) => b.nutrients.fiber_g - a.nutrients.fiber_g);
console.log('\n高食物繊維、低カロリーの食品:');
highFiber.slice(0, 10).forEach(f => {
console.log(` ${f.food_name}: ${f.nutrients.fiber_g}g 食物繊維, ${f.nutrients.calories_kcal} kcal`);
});
JavaScript:ブラウザでのCSVの読み込み
// ブラウザベースのCSV解析(依存関係なし)
async function loadMacroCSV(url) {
const response = await fetch(url);
const text = await response.text();
const lines = text.split('\n').filter(line => line.trim());
const headers = parseCSVLine(lines[0]);
return lines.slice(1).map(line => {
const values = parseCSVLine(line);
const obj = {};
headers.forEach((header, i) => {
obj[header] = isNaN(values[i]) ? values[i] : parseFloat(values[i]);
});
return obj;
});
}
function parseCSVLine(line) {
const result = [];
let current = '';
let inQuotes = false;
for (const char of line) {
if (char === '"') { inQuotes = !inQuotes; }
else if (char === ',' && !inQuotes) { result.push(current.trim()); current = ''; }
else { current += char; }
}
result.push(current.trim());
return result;
}
// 使用例
const foods = await loadMacroCSV('/data/macro_reference_table.csv');
console.log(`Loaded ${foods.length} foods`);
これらの例は、データの読み込み、検索とフィルタリング、カテゴリごとのグループ化、栄養密度によるソートなど、最も一般的な操作を示しています。データ構造は意図的にシンプルで、特別なライブラリを使用せずに作業できるようになっています。
データソース
マクロリファレンステーブルは、以下の主要なソースから編纂されています:
USDA SRレガシーデータベース。 USDA標準参照レガシーデータベースは、米国の食品成分に関する基礎データセットです。7600以上の食品項目に対するラボ分析された栄養データが含まれています。私たちのテーブルは、一般的な/ブランド名の食品に対してSRレガシーを主要なソースとして使用しています。SRレガシーは、より広く検証され、栄養研究で引用されているため、より新しいFoodData Central FNDDSよりも選ばれました。
USDA FoodData Central。 SRレガシーに含まれていない食品、特に新しい食品項目や更新された値については、FoodData CentralのFoundation FoodsおよびSurvey Foodsデータセットを参照しています。
国際的な食品成分データベース。 米国のデータベースに登場しないが世界中で消費される食品については、Public Health EnglandのMcCance and Widdowson成分表、Food Standards Australia New Zealand (FSANZ)のNUTTAB、Canadian Nutrient File (CNF)、Danish Food Composition Databank (Frida)のデータをクロスリファレンスしています。これは特に熱帯果物、地域の穀物、米国以外で一般的な調理方法に関連しています。
メーカーのデータ。 スナックや飲料カテゴリの加工食品やブランド品については、メーカーが提供する栄養成分表示を参照しています。メーカーのデータがラボ分析と矛盾する場合は、その不一致を記録し、ラボ値にデフォルトします。
すべての値は、少なくとも2つの独立したソースに対してクロスリファレンスされています。ソース間で10%以上の不一致がある場合は、その原因を調査し(通常は異なる調理方法や品種の違い)、食品が通常どのように消費されるかを最も代表する値を選択します。
データセットはバージョン管理されています。現在のバージョンは1.4.0で、2026年3月に最終更新されました。四半期ごとにテーブルを更新し、修正を組み込み、リクエストされた食品を追加し、ソースデータベースの重要な変更を反映させています。
修正の貢献方法
栄養データは本質的に不完全です。食品成分は地域、季節、品種、調理方法によって変動します。エラーを見つけたり、信頼できるソースに基づく修正がある場合は、ぜひお知らせください。
修正を提出する方法は3つあります:
GitHub Issues。 マクロリファレンステーブルは、公開GitHubリポジトリにホストされています。食品名、誤っていると思われるフィールド、現在の値、正しいと思われる値、ソースへのリンクを含む問題をオープンしてください。毎週問題を確認します。
メール。 修正をdata@nutrola.comに送信してください。同じ情報を含めてください:食品名、フィールド、現在の値、提案された値、ソース。5営業日以内に返信します。
プルリクエスト。 Gitに慣れている場合は、リポジトリをフォークし、CSVまたはJSONファイルを直接編集してプルリクエストを送信できます。PRの説明にソースを含めてください。信頼できるデータに基づく修正をレビューし、マージします。
ブランド品や独自の製品については、このプロセスを通じての提出は受け付けていません。それらは、Nutrolaの主要な食品データベースパイプラインを通じて処理され、独自の検証ワークフローがあります。
NutrolaのAPIとの統合によるリアルタイムデータ
ダウンロード可能なマクロリファレンステーブルは静的スナップショットであり、オフラインでの使用、埋め込まれたアプリケーション、教育資料、迅速な参照に最適です。しかし、スケールでリアルタイムの栄養データが必要な場合、NutrolaのNutrition Data APIは、これらのテーブルに含まれるすべての情報とそれ以上のものを提供します。
APIは300万以上の食品エントリをカバーしており(リファレンステーブルの500以上に対して)、70以上の栄養素を含む完全な微量栄養素プロファイル、バーコードスキャン、テキスト検索、オートコンプリートをサポートし、47か国からのブランド製品のデータを提供します。これは、毎日200万人以上が使用するNutrolaアプリを支えるデータです。
開発者向け:APIはRESTfulで、JSONを返し、1日500リクエストの無料プランを提供しています — プロトタイピングや個人プロジェクトに十分です。有料プランは数百万のリクエストにスケールします。詳細なドキュメントはapi.nutrola.com/docsで確認できます。
研究者や機関向け:私たちは、拡張されたレート制限やバルクエクスポート機能を持つ学術ライセンスを提供しています。詳細についてはresearch@nutrola.comまでお問い合わせください。
マクロリファレンステーブルとAPIは相互に補完し合います。オフライン作業、埋め込まれたデータセット、自己完結型ファイルが必要な場合はテーブルを使用してください。幅広さ、深さ、リアルタイムの更新、検索機能が必要な場合はAPIを使用してください。
よくある質問
マクロリファレンステーブルはどのくらいの頻度で更新されますか?
テーブルは四半期ごとに更新します。各リリースには新しいバージョン番号が付与されます(現在のバージョンは1.4.0です)。更新には、ユーザーから提出された修正、一般的にリクエストされた食品の追加、ソースデータベースが改訂値を公開した際の調整が含まれます。JSONファイルには、メタデータにバージョンと生成日が含まれているため、プログラム的に最新バージョンを確認できます。
このデータを商業アプリケーションで使用できますか?
はい。マクロリファレンステーブルは、クリエイティブ・コモンズ 表示 4.0(CC BY 4.0)ライセンスの下でリリースされています。個人および商業プロジェクトでデータを使用、変更、再配布できますが、必ず帰属を提供してください。nutrola.comへのリンクや「Nutrola Macro Reference Tables」の言及があれば十分です。許可を求めたり、料金を支払ったりする必要はありません。
500以上の食品だけでなく、Nutrolaのデータベース全体ではないのはなぜですか?
リファレンステーブルは、最も一般的に消費される食品の実用的で高品質なサブセットを提供するように設計されています。7つのカテゴリにわたる500以上の項目をカバーすることで、ほとんどの国で人々が日常的に食べるものの約90%を対象としています。300万件のエントリに拡張すると、多くの使用ケースにとってファイルが扱いにくくなります(完全なデータベースは2GBを超えます)。完全なデータセットが必要な場合は、Nutrola APIを使用するとすべてにアクセスできます。
値はサービングあたりですか、それとも100グラムあたりですか?
サービングあたりです。すべてのエントリにはサービングの説明(例:「中サイズのリンゴ1個(182g)」)と対応するグラム重量が含まれているため、各栄養素の値をサービング重量で割り、100を掛けることで100グラムあたりの値に簡単に変換できます。サービングベースの値を選んだ理由は、食事の追跡、食事プランの作成、クライアント向けアプリケーションにおいて、より即時的に役立つからです。
データを100グラムあたりの値に変換するにはどうすればよいですか?
各栄養素の値に100を掛け、serving_weight_gフィールドで割ります。例えば、170gの鶏むね肉のサービングに53.4gのタンパク質が含まれている場合、100gあたりのタンパク質値は(53.4 * 100) / 170 = 31.4gです。以下は簡単なPython関数です:
def per_100g(food, nutrient_field):
"""サービングあたりの栄養素値を100gあたりに変換します。"""
serving_weight = food['serving_weight_g']
if serving_weight == 0:
return 0
return round(food[nutrient_field] * 100 / serving_weight, 1)
必要な食品がテーブルにない場合はどうすればよいですか?
まず、異なる名前の類似食品が存在するかどうかを確認してください — テキストエディタの検索機能や簡単なスクリプトを使用してfood_nameフィールドを検索できます。食品が本当に含まれていない場合は、2つのオプションがあります:GitHubリポジトリを通じてリクエストを提出する(需要に基づいて追加を優先します)、またはNutrolaのAPIを使用して300万以上の食品にアクセスすることができます。ワンオフの検索には、Nutrolaアプリ自体が完全なデータベースを無料で検索できる機能を提供しています。