複数の DICOM ファイルを単一の JSON Array に変換する方法

複数の DICOM ファイルを単一の JSON Array に変換する方法

このチュートリアルでは、複数の DICOM ファイルを C# を使用して単一の JSON レイヤーに変換する方法を示しています. このアプローチは、分析ツール、データベース、またはデータ パイプラインのための Dicom メタデータを輸出する必要があるデータエンジニアに最適です。

JSON Array 輸出の利点

  • ●Bulk データ処理:- 複数の DICOM レコードを 1 つの操作でデータベースにインポートします。

  • ●「アナリティクス準備」:- JSON リリースは、Python、Spark、またはデータストレージに直接充電することができます。

  • コンパクト出力*:- すべてのメタデータを含む単一ファイルは、データ管理を簡素化します。

原題: Preparing the Environment

  • Visual Studio または 互換性のある .NET IDE を設定します.
  • 新しい .NET 8 コンソールアプリケーションプロジェクトを作成します。
  • NuGet Package Manager から Aspose.Medical をインストールします。
  • 複数の DICOM ファイルを含むフォルダーを作成します。

複数の DICOM ファイルを JSON Array に変換するためのステップアップガイド

ステップ1:インストール Aspose.Medical

NuGet を使用してプロジェクトに Aspose.Medical ライブラリを追加します。

Install-Package Aspose.Medical

ステップ2:必要な名称スペースを含む

あなたのコードに必要な名称スペースへの参照を追加します.

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;

ステップ3:複数のDICOMファイルをアップロード

DICOMファイルをフォルダーからコレクションにアップロードします。

string inputFolder = @"C:\DicomStudies";
string[] dicomPaths = Directory.GetFiles(inputFolder, "*.dcm");

List<DicomFile> dicomFiles = new();
foreach (string path in dicomPaths)
{
    dicomFiles.Add(DicomFile.Open(path));
}

ステップ4:データセットの抽出

ダウンロードされたファイルから Dataset オブジェクトの範囲を構築します。

Dataset[] datasets = dicomFiles
    .Select(dcm => dcm.Dataset)
    .ToArray();

ステップ5:JSON Arrayにシリアル化する

利用 DicomJsonSerializer.Serialize データセットアレイで

string jsonArray = DicomJsonSerializer.Serialize(datasets, writeIndented: true);

ステップ6:JSONアレイを保存する

JSON をファイルに保存します。

File.WriteAllText("dicom_studies.json", jsonArray);
Console.WriteLine($"Exported {datasets.Length} DICOM datasets to JSON array.");

完全コード例

以下は、複数の DICOM ファイルを JSON ラインに変換する方法を示す完全な例です。

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;

string inputFolder = @"C:\DicomStudies";
string outputFile = "dicom_studies.json";

// Get all DICOM files
string[] dicomPaths = Directory.GetFiles(inputFolder, "*.dcm");
Console.WriteLine($"Found {dicomPaths.Length} DICOM files.");

// Load all files
List<DicomFile> dicomFiles = new();
foreach (string path in dicomPaths)
{
    try
    {
        dicomFiles.Add(DicomFile.Open(path));
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Skipping invalid file: {Path.GetFileName(path)}");
    }
}

// Build dataset array
Dataset[] datasets = dicomFiles
    .Select(dcm => dcm.Dataset)
    .ToArray();

// Serialize to JSON array
string jsonArray = DicomJsonSerializer.Serialize(datasets, writeIndented: true);

// Save to file
File.WriteAllText(outputFile, jsonArray);

Console.WriteLine($"Successfully exported {datasets.Length} datasets to {outputFile}");

例 JSON Array 出力

JSON アレイの出力は、このように見えます:

[
  {
    "00080005": { "vr": "CS", "Value": ["ISO_IR 100"] },
    "00100010": { "vr": "PN", "Value": [{ "Alphabetic": "DOE^JOHN" }] },
    "00100020": { "vr": "LO", "Value": ["12345"] }
  },
  {
    "00080005": { "vr": "CS", "Value": ["ISO_IR 100"] },
    "00100010": { "vr": "PN", "Value": [{ "Alphabetic": "SMITH^JANE" }] },
    "00100020": { "vr": "LO", "Value": ["67890"] }
  }
]

・LINQで大規模なデータセットの処理

大型データセットのメモリ管理を改善するには、LINQプロジェクションを使用してください。

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;

string inputFolder = @"C:\LargeDicomArchive";
string outputFile = "large_export.json";

// Process files lazily to manage memory
Dataset[] datasets = Directory.GetFiles(inputFolder, "*.dcm")
    .Select(path => 
    {
        try
        {
            return DicomFile.Open(path).Dataset;
        }
        catch
        {
            return null;
        }
    })
    .Where(ds => ds != null)
    .ToArray()!;

string jsonArray = DicomJsonSerializer.Serialize(datasets, writeIndented: true);
File.WriteAllText(outputFile, jsonArray);

Console.WriteLine($"Exported {datasets.Length} datasets.");

進歩報告の追加

大きなバッチの場合、進歩レポートを追加します:

using Aspose.Medical.Dicom;
using Aspose.Medical.Dicom.Serialization;

string inputFolder = @"C:\DicomStudies";
string[] dicomPaths = Directory.GetFiles(inputFolder, "*.dcm");

List<Dataset> datasets = new();
int processed = 0;
int total = dicomPaths.Length;

foreach (string path in dicomPaths)
{
    try
    {
        DicomFile dcm = DicomFile.Open(path);
        datasets.Add(dcm.Dataset);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error: {Path.GetFileName(path)} - {ex.Message}");
    }
    
    processed++;
    if (processed % 100 == 0 || processed == total)
    {
        Console.WriteLine($"Progress: {processed}/{total} ({processed * 100 / total}%)");
    }
}

string jsonArray = DicomJsonSerializer.Serialize(datasets.ToArray(), writeIndented: true);
File.WriteAllText("export.json", jsonArray);

Console.WriteLine($"Export complete: {datasets.Count} datasets.");

JSON Array を Analytics ツールにインポートする

Python 例

import json
import pandas as pd

# Load the exported JSON array
with open('dicom_studies.json', 'r') as f:
    dicom_data = json.load(f)

# Convert to DataFrame for analysis
df = pd.json_normalize(dicom_data)
print(df.head())

モンゴDBへのダウンロード

// Using mongoimport
// mongoimport --db medical --collection studies --jsonArray --file dicom_studies.json

記憶考慮

非常に大きなデータセットで作業する場合:

  • バッチのプロセス:ファイルを100〜500ファイルのバットに分けます。
  • ストリーム出力:非常に大きいリラックスのためのストライムベースのシリアリズムを使用します。
  • ファイルを配置する: データセットを抽出した後、DicomFile オブジェクトが解除されることを確認します。
// Batch processing example
int batchSize = 100;
string[] allFiles = Directory.GetFiles(inputFolder, "*.dcm");
int batchNumber = 0;

for (int i = 0; i < allFiles.Length; i += batchSize)
{
    string[] batch = allFiles.Skip(i).Take(batchSize).ToArray();
    Dataset[] datasets = batch
        .Select(path => DicomFile.Open(path).Dataset)
        .ToArray();
    
    string batchJson = DicomJsonSerializer.Serialize(datasets, writeIndented: true);
    File.WriteAllText($"batch_{batchNumber++}.json", batchJson);
}

追加情報

  • JSON Array フォーマットは、NoSQL データベースへの大量輸入に最適です。
  • ストレージ効率のために大型JSONファイルを圧縮することを検討します。
  • ストリーミングシナリオでは、代わりにNDJSON(新線無制限 JSON)フォーマットを使用することを検討してください。

結論

このチュートリアルは、Aspose.Medical を使用して複数の DICOM ファイルを C# で単一の JSON ラインに変換する方法を示しています。このアプローチでは、分析、データベースの輸入、およびデータパイプライン統合のための効率的な大規模データ輸出が可能になります。

 日本語