How to Read Data From CSV File And Store It In Database C#
今日のデジタル世界では、データを効率的に処理することが重要なタスクです。 ソフトウェア開発において一般的な要件は、CSVファイルからデータを読み取り、それをデータベースに保存することです。 このチュートリアルでは、C#を使用してCSVファイルからデータを読み取り、SQL Serverデータベースに保存する手順を、IronXLライブラリを用いて説明します。 このガイドは初心者向けに設計されており、シンプルで興味深い方法で説明されます。
基本を理解する
CSV ファイルとは何ですか?
CSV(コンマ区切り値)ファイルは、コンマで区切られたデータを含むプレーンテキストファイルです。 そのシンプルさと、Excelなどのさまざまなアプリケーションとの互換性のため、データ転送の一般的なフォーマットです。
SQL Serverとデータベースの役割
SQL ServerはMicrosoftによるデータベース管理システムです。 それはデータを構造化方式で保存および管理するために使用されます。 ここでは、CSVデータをSQL Serverテーブルに保存します。
IronXLの紹介
IronXLは、.NETアプリケーション向けに設計されたExcelライブラリで、開発者がMicrosoft Office Interopを必要とせずにExcelファイルを読み取り、生成し、編集できるように特別に設計されています。このライブラリは、.NET Core、.NET Standard、および.NET Frameworkを含むさまざまな.NETバージョンとプラットフォーム、およびWindows、Linux、macOSなど、さまざまなオペレーティングシステムとの互換性で際立っています。 これは、特にCSVファイルを扱うための、データインポートに強力なライブラリです。
How to Read and Store Data From CSV Files in C
- Visual StudioでC#コンソールプログラムを作成します。
- NuGetパッケージマネージャーを使用してCSVライブラリをインストールします。
- ライブラリを使用してプログラムにCSVファイルをロードします。
- データベースとの接続を作成します。
- ライブラリを使用してCSVファイルからコンテンツを読み取ります。
SqlBulkCopyメソッドを使用して、その内容をデータベースにコピーしてください。
以下は例のコードスニペットです:
using System;
using System.Data;
using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
using System.Globalization;
using System.IO;
using CsvHelper;
namespace CsvReader
{
class Program
{
static void Main(string[] args)
{
string csvPath = @"path\to\your\csv\file.csv";
using (var reader = new StreamReader(csvPath))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
// Mapping the CSV data to the corresponding model
var records = csv.GetRecords<YourModel>();
using (var sqlBulkCopy = new SqlBulkCopy("your_connection_string"))
{
sqlBulkCopy.DestinationTableName = "YourTableName";
sqlBulkCopy.WriteToServer(records.AsDataReader());
}
Console.WriteLine("Data imported successfully!");
}
}
}
// Define your model that maps to the CSV columns
public class YourModel
{
// Define properties here representing the CSV columns
}
}
using System;
using System.Data;
using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
using System.Globalization;
using System.IO;
using CsvHelper;
namespace CsvReader
{
class Program
{
static void Main(string[] args)
{
string csvPath = @"path\to\your\csv\file.csv";
using (var reader = new StreamReader(csvPath))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
// Mapping the CSV data to the corresponding model
var records = csv.GetRecords<YourModel>();
using (var sqlBulkCopy = new SqlBulkCopy("your_connection_string"))
{
sqlBulkCopy.DestinationTableName = "YourTableName";
sqlBulkCopy.WriteToServer(records.AsDataReader());
}
Console.WriteLine("Data imported successfully!");
}
}
}
// Define your model that maps to the CSV columns
public class YourModel
{
// Define properties here representing the CSV columns
}
}
Imports System
Imports System.Data
Imports System.Data.SqlClient ' For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
Imports System.Globalization
Imports System.IO
Imports CsvHelper
Namespace CsvReader
Class Program
Shared Sub Main(args As String())
Dim csvPath As String = "path\to\your\csv\file.csv"
Using reader As New StreamReader(csvPath)
Using csv As New CsvReader(reader, CultureInfo.InvariantCulture)
' Mapping the CSV data to the corresponding model
Dim records = csv.GetRecords(Of YourModel)()
Using sqlBulkCopy As New SqlBulkCopy("your_connection_string")
sqlBulkCopy.DestinationTableName = "YourTableName"
sqlBulkCopy.WriteToServer(records.AsDataReader())
End Using
Console.WriteLine("Data imported successfully!")
End Using
End Using
End Sub
End Class
' Define your model that maps to the CSV columns
Public Class YourModel
' Define properties here representing the CSV columns
End Class
End Namespace
必ず "path\to\your\csv\file.csv" はCSVファイルの実際のパスに、YourModel はCSVデータを表すモデルに、"your_connection_string" はデータベース接続文字列に、"YourTableName" はデータベーステーブルの名前に置き換えてください。
環境の設定
前提条件
- Visual Studio: Visual Studioがインストールされていることを確認してください。
- SQL Server: SQL Serverがインストールされ、アクセスできる状態になっている必要があります。
- IronXLのインストール:次のNuGetコマンドを実行してIronXLをインストールします。
dotnet add package IronXL.Excel
IronXLをインストールしたいプロジェクトディレクトリ内でこれらのコマンドを実行することを確認してください。
データをインポートする前に、SQL Serverデータベースに宛先テーブルを作成してください。
データをインポートする前に、SQL Serverデータベースに宛先テーブルを作成します。 このテーブルがCSVデータを保存します。
CREATE TABLE YourTableName (
Column1 DataType,
Column2 DataType,
...
);
お使いの固有の詳細に DataType を置き換えてください。
CSVデータをインポートするためのステップバイステップガイド
- まず、インポートしたいデータを含むCSVファイルを用意します。
-
- Visual Studioで新しいC#コンソールアプリケーションプロジェクトを作成します。
-
CSVファイルを読み取るためにCsvHelper NuGetパッケージをインストールします。 Visual StudioのNuGetパッケージマネージャーコンソールを開いて、次のコマンドを実行することでこれを行うことができます:
Install-Package CsvHelperInstall-Package CsvHelperSHELL -
必要なusingステートメントをC#コードファイルの上部に追加します:
using System; using System.IO; using System.Globalization; using CsvHelper; using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient insteadusing System; using System.IO; using System.Globalization; using CsvHelper; using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient insteadImports System Imports System.IO Imports System.Globalization Imports CsvHelper Imports System.Data.SqlClient ' For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead$vbLabelText $csharpLabel -
コード内でCSVファイルのパスを指定します。例:
string csvFilePath = @"C:\path\to\your\csv\file.csv";string csvFilePath = @"C:\path\to\your\csv\file.csv";Dim csvFilePath As String = "C:\path\to\your\csv\file.csv"$vbLabelText $csharpLabel必ず
C:\path\to\your\csv\file.csvはCSVファイルの実際のパスに置き換えてください。 -
CSVファイルを読み取るために
StreamReaderクラスの新しいインスタンスを作成します:using (var reader = new StreamReader(csvFilePath)) { // code goes here }using (var reader = new StreamReader(csvFilePath)) { // code goes here }Using reader = New StreamReader(csvFilePath) ' code goes here End Using$vbLabelText $csharpLabel -
CsvReaderクラスの新しいインスタンスを作成し、StreamReaderオブジェクトを渡します:using (var reader = new StreamReader(csvFilePath)) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { // code goes here }using (var reader = new StreamReader(csvFilePath)) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { // code goes here }Using reader = New StreamReader(csvFilePath) Using csv = New CsvReader(reader, CultureInfo.InvariantCulture) ' code goes here End Using End Using$vbLabelText $csharpLabel -
必要に応じて
CsvConfigurationオブジェクトをコンストラクタに渡してCsvReaderを設定します。 例えば:var config = new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = true, }; using var csv = new CsvReader(reader, config);var config = new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = true, }; using var csv = new CsvReader(reader, config);Imports System.Globalization Imports CsvHelper Dim config As New CsvConfiguration(CultureInfo.InvariantCulture) With { .HasHeaderRecord = True } Using csv As New CsvReader(reader, config) ' Use csv here End Using$vbLabelText $csharpLabel -
GetRecords<t>()メソッドをCsvReaderオブジェクトで使用して、CSVデータをオブジェクトのコレクションに読み込みます。 CSVファイル内の各レコードを表すオブジェクトの型として<t>を置き換えてください。例:var records = csv.GetRecords<YourModel>();var records = csv.GetRecords<YourModel>();Dim records = csv.GetRecords(Of YourModel)()$vbLabelText $csharpLabel必ず
YourModelはモデルクラスの実際の名前に置き換えてください。 -
レコードを反復し、必要な処理や検証を実行します。
foreach (var record in records) { // Process each record as needed }foreach (var record in records) { // Process each record as needed }For Each record In records ' Process each record as needed Next record$vbLabelText $csharpLabel - ADO.NETまたはEntity FrameworkなどのORMツールを使用して、SQL Serverデータベースへの接続をオプションで確立します。
- 選択したデータベースアクセスメカニズムを使用して、各レコードをデータベースに挿入します。 例えば、ADO.NETを使用している場合には、
SqlBulkCopyクラスを利用してデータを効率的に一括挿入できます。 - インポートプロセス中に発生する可能性のある例外を処理し、適切なエラーメッセージやログを提供します。
- アプリケーションを実行し、CSVデータがデータベースに正常にインポートされていることを確認することでテストします。
それだけです! これで、C#を使用してCSVデータをSQL Serverデータベースに正常にインポートしました。
ステップ1: CSVファイルを読み取る
CSVファイルからデータをインポートするタスクを開始する際には、最初に重要なステップはそのデータを正確に読み取ることです。 通常、CSVファイル内の各行はデータレコードを表し、各レコードはコンマで区切られた1つ以上のフィールドで構成されます。
次に、CSVファイルを処理するためにIronXLライブラリを使用します。IronXLを使用してCSVファイルを読み取るには、WorkBook と WorkSheet の各クラスが使用されます。 WorkBook クラスは、Excelファイルや私たちの場合CSVファイルのように、スプレッドシート全体を表します。CSVファイルのパスを WorkBook オブジェクトに読み込むと、IronXLはCSVファイルをスプレッドシート/データテーブルとして扱います。
using IronXL;
using System.Data;
public class CSVReader
{
// Reads a CSV file and converts it to a DataTable
public DataTable ReadCSV(string filePath)
{
WorkBook workbook = WorkBook.Load(filePath);
WorkSheet sheet = workbook.DefaultWorkSheet;
// Convert to DataTable for easier processing
DataTable dataTable = sheet.ToDataTable(true); // Set to 'true' if your CSV has a header row
return dataTable;
}
}
using IronXL;
using System.Data;
public class CSVReader
{
// Reads a CSV file and converts it to a DataTable
public DataTable ReadCSV(string filePath)
{
WorkBook workbook = WorkBook.Load(filePath);
WorkSheet sheet = workbook.DefaultWorkSheet;
// Convert to DataTable for easier processing
DataTable dataTable = sheet.ToDataTable(true); // Set to 'true' if your CSV has a header row
return dataTable;
}
}
Imports IronXL
Imports System.Data
Public Class CSVReader
' Reads a CSV file and converts it to a DataTable
Public Function ReadCSV(ByVal filePath As String) As DataTable
Dim workbook As WorkBook = WorkBook.Load(filePath)
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Convert to DataTable for easier processing
Dim dataTable As DataTable = sheet.ToDataTable(True) ' Set to 'true' if your CSV has a header row
Return dataTable
End Function
End Class
ステップ2: データベース接続の確立
SQL Serverデータベースへの接続を確立することは、CSVデータを保存するプロセスの基本的なステップです。 このステップでは、アプリケーションとデータベースサーバー間の通信リンクを設定します。 成功した接続は重要です、なぜなら、それがなければデータベースへのデータ転送が不可能になるからです。
このステップは、C#で接続文字列を使用して接続を作成して開くことに焦点を当てています。 接続文字列は接続を確立するために必要な情報を含む重要なコンポーネントです。 それはデータベースへのドアを開けるキーのようなものです。
using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
public class DatabaseConnector
{
// Connection string to connect to the database
private string connectionString = "your_connection_string_here";
public SqlConnection ConnectToDatabase()
{
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
return connection;
}
}
using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
public class DatabaseConnector
{
// Connection string to connect to the database
private string connectionString = "your_connection_string_here";
public SqlConnection ConnectToDatabase()
{
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
return connection;
}
}
Imports System.Data.SqlClient ' For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
Public Class DatabaseConnector
' Connection string to connect to the database
Private connectionString As String = "your_connection_string_here"
Public Function ConnectToDatabase() As SqlConnection
Dim connection As New SqlConnection(connectionString)
connection.Open()
Return connection
End Function
End Class
connectionString 変数はあなたのSQL Serverに接続するために必要な詳細すべてを保持します。 通常、サーバー名、データベース名、ユーザーID、およびパスワードが含まれています。 接続文字列の例は次のとおりです:Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;。 これらのプレースホルダーを実際のサーバーの詳細で置き換えることが重要です。
ステップ3: データをデータベースに保存する
SQL Serverデータベースへの接続を確立した後、次に重要なステップはCSVデータをデータベースに保存することです。 このステップでは、読み取られて処理されたデータをSQL Serverテーブルに転送します。 これはデータ処理プロセスの重要な部分であり、ローカルファイルからデータベースサーバーへの実際のデータ移行が関与します。
このステップでは、DataTable に保存されたCSVデータがどのようにしてSQL Serverデータベースに転送されるかに焦点を当てます。 これを効率的に達成するために、C#とSQL Serverの機能を組み合わせて使用します。
using System;
using System.Data;
using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
public class DataImporter
{
public void ImportData(DataTable dataTable)
{
using (SqlConnection connection = new DatabaseConnector().ConnectToDatabase())
{
// Check if the table exists and create it if it does not.
string tableName = "CSVData"; // Use a valid SQL table name format
string checkTable = $"IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{tableName}') BEGIN ";
string createTable = "CREATE TABLE " + tableName + " (";
for (int i = 0; i < dataTable.Columns.Count; i++)
{
createTable += $"[{dataTable.Columns[i].ColumnName}] NVARCHAR(MAX)";
if (i < dataTable.Columns.Count - 1)
createTable += ", ";
}
createTable += ") END";
SqlCommand createTableCommand = new SqlCommand(checkTable + createTable, connection);
createTableCommand.ExecuteNonQuery();
// Now we use SqlBulkCopy to import the data
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = tableName;
try
{
bulkCopy.WriteToServer(dataTable);
Console.WriteLine("Data imported successfully!");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
}
using System;
using System.Data;
using System.Data.SqlClient; // For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
public class DataImporter
{
public void ImportData(DataTable dataTable)
{
using (SqlConnection connection = new DatabaseConnector().ConnectToDatabase())
{
// Check if the table exists and create it if it does not.
string tableName = "CSVData"; // Use a valid SQL table name format
string checkTable = $"IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{tableName}') BEGIN ";
string createTable = "CREATE TABLE " + tableName + " (";
for (int i = 0; i < dataTable.Columns.Count; i++)
{
createTable += $"[{dataTable.Columns[i].ColumnName}] NVARCHAR(MAX)";
if (i < dataTable.Columns.Count - 1)
createTable += ", ";
}
createTable += ") END";
SqlCommand createTableCommand = new SqlCommand(checkTable + createTable, connection);
createTableCommand.ExecuteNonQuery();
// Now we use SqlBulkCopy to import the data
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = tableName;
try
{
bulkCopy.WriteToServer(dataTable);
Console.WriteLine("Data imported successfully!");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
}
Imports System
Imports System.Data
Imports System.Data.SqlClient ' For .NET Core/.NET 5+, use Microsoft.Data.SqlClient instead
Public Class DataImporter
Public Sub ImportData(dataTable As DataTable)
Using connection As SqlConnection = New DatabaseConnector().ConnectToDatabase()
' Check if the table exists and create it if it does not.
Dim tableName As String = "CSVData" ' Use a valid SQL table name format
Dim checkTable As String = $"IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{tableName}') BEGIN "
Dim createTable As String = "CREATE TABLE " & tableName & " ("
For i As Integer = 0 To dataTable.Columns.Count - 1
createTable &= $"[{dataTable.Columns(i).ColumnName}] NVARCHAR(MAX)"
If i < dataTable.Columns.Count - 1 Then
createTable &= ", "
End If
Next
createTable &= ") END"
Dim createTableCommand As New SqlCommand(checkTable & createTable, connection)
createTableCommand.ExecuteNonQuery()
' Now we use SqlBulkCopy to import the data
Using bulkCopy As New SqlBulkCopy(connection)
bulkCopy.DestinationTableName = tableName
Try
bulkCopy.WriteToServer(dataTable)
Console.WriteLine("Data imported successfully!")
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Using
End Using
End Sub
End Class
この処理は、DatabaseConnector クラスを使用してSQL Serverデータベースへの接続を開くことから始まり、データのトランザクションの道を確保します。 このメソッドは、データベース内に "CSVData" という名前のテーブルが存在するかどうかを確認します。
テーブルが見つからない場合、それを作成します。 テーブルのスキーマは、メソッドに渡された DataTable スキーマに基づいて構築され、すべての列は任意のテキストデータを収容するために NVARCHAR(MAX) に設定されます。 これは一般的なアプローチであり、特定のデータ型にもう少し緊密に匹敵するために精緻化が必要かもしれません。
その後、テーブルの存在を確認するか、それを作成するSQLコマンドが作成され実行されます。 これにより、その後の一括コピー操作がデータ挿入用の宛先テーブルを持つことが保証されます。 テーブルの準備が整うと、SqlBulkCopy クラスを使用して、DataTable から直接SQL Serverテーブルにデータを転送します。 この操作は、大量のデータを効率的に扱うための大規模なデータ転送に対応できるように設計されています。
ステップ4: すべてをまとめる
CSVデータを読み取り、データベース接続を確立し、データを転送する準備を整えるという以前のステップを丹念に行った後、最後で重要な段階である、これらの個別のコンポーネントを統合して、一貫性のあるプロセスとしてまとめます。
この統合はC#アプリケーションのMain メソッドで行われ、すべてが一緒に集まり、CSVファイルからSQL Serverデータベースへのデータインポートの実際の実行を可能にします。
class Program
{
static void Main(string[] args)
{
string filePath = "path_to_your_csv_file.csv";
CSVReader reader = new CSVReader();
DataTable dataTable = reader.ReadCSV(filePath);
DataImporter importer = new DataImporter();
importer.ImportData(dataTable);
Console.WriteLine("Data imported successfully!");
}
}
class Program
{
static void Main(string[] args)
{
string filePath = "path_to_your_csv_file.csv";
CSVReader reader = new CSVReader();
DataTable dataTable = reader.ReadCSV(filePath);
DataImporter importer = new DataImporter();
importer.ImportData(dataTable);
Console.WriteLine("Data imported successfully!");
}
}
Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim filePath As String = "path_to_your_csv_file.csv"
Dim reader As New CSVReader()
Dim dataTable As DataTable = reader.ReadCSV(filePath)
Dim importer As New DataImporter()
importer.ImportData(dataTable)
Console.WriteLine("Data imported successfully!")
End Sub
End Class
path_to_your_csv_file.csv はCSVファイルのパスに置き換えてください。
プロジェクトを実行する
プロジェクトを実行すると、次の出力が表示されます。 成功のメッセージは、すべての操作が正常に実行され、データがデータベースにコピーされたことを表します。
Data imported successfully!
SQL Server Management Studio (SSMS)を開いて、データベースの下のテーブルを確認できます。 テーブルには次のデータが表示されます。

結論
このチュートリアルでは、C#を使用してCSVファイルからデータを読み取り、SQL Serverデータベースに保存するプロセスを案内しました。 これらの手順に従い、IronXLライブラリを利用することで、C#アプリケーションでCSVデータを効率的に管理できます。
IronXLは、購入を決定する前にその機能を体験するための無料トライアルをユーザーに提供しています。 この完全な機能を備えたトライアルにより、潜在的なユーザーは、本番環境で透かし無しで製品をテストして評価することができます。 トライアル期間後にIronXLをプロジェクトで使用し続けることを決定した場合、製品のライセンスは $999 から始まります。
よくある質問
C#でCSVファイルからデータを読み取る方法は?
C#でCSVファイルからデータを読み取るには、IronXLライブラリを使用できます。IronXLは、CSVファイルをExcelスプレッドシートのように読み取り、操作できる `WorkBook` および `WorkSheet` クラスを提供しています。
C#を使用してCSVデータをSQL Serverデータベースに保存する手順は?
C#を使用してCSVデータをSQL Serverデータベースに保存するには、まずIronXLでCSVを読み取り、データを `DataTable` にロードし、`SqlBulkCopy` を使用してデータをSQL Serverテーブルに効率的に挿入します。
私のC#プロジェクトでIronXLを使用するためにインストールする方法は?
NuGetパッケージマネージャーを使用して、Visual StudioでIronXLをインストールできます。NuGetパッケージマネージャーで'IronXL'を検索し、プロジェクトに追加してください。
C#でCSVファイルを扱うためにIronXLを使用する主な利点は何ですか?
C#でCSVファイルを扱うためにIronXLを使用する主な利点は、.NETアプリケーション内でCSVとExcelファイルをシームレスに管理および操作できることであり、さまざまな.NETバージョンとオペレーティングシステムに互換性を提供することです。
IronXLを使用してCSVファイルだけでなくExcelファイルも扱うことはできますか?
はい、IronXLはExcelおよびCSVファイルの処理用に設計されており、.NETアプリケーション内でスプレッドシートデータを管理するための多用途なツールです。
IronXLを使用してCSVファイルを読み取る際にエラーが発生した場合、どうすればよいですか?
IronXLを使用してCSVファイルを読み取る際にエラーが発生した場合は、CSVファイルが正しくフォーマットされていること、IronXLがプロジェクトに正しくインストールされていることを確認してください。トラブルシューティングのヒントは、IronXLのドキュメントを参照してください。
購入を決定する前にIronXLの機能をテストする方法は?
IronXLは、使用制限なしで製品をテストおよび評価できる完全機能の無料トライアルを提供しています。
IronXLを使用してデータベースにCSVデータを保存するための前提条件は何ですか?
前提条件には、Visual Studioのインストール、SQL Serverへのアクセス、そしてNuGet経由でのIronXLのインストールが含まれます。また、CSVデータを保存するためのSQL Serverテーブルを設定する必要があります。




