여러 DICOM 파일을 하나의 JSON Array로 변환하는 방법

여러 DICOM 파일을 하나의 JSON Array로 변환하는 방법

이 튜토리얼은 여러 DICOM 파일을 C#를 사용하여 하나의 JSON 라인으로 변환하는 방법을 보여줍니다.이 접근 방식은 분석 도구, 데이터베이스 또는 데이터 파이프라인을 위해 디코마 메타 데이터를 수출해야하는 데이터 엔지니어에게 이상적입니다.

JSON 아레이 수출의 이점

  • *Bulk 데이터 처리 :- 여러 DICOM 레코드를 하나의 작업에서 데이터베이스로 가져오십시오.

    • 분석 준비가 되었습니다 * :- JSON 레이어는 Python, Spark 또는 데이터 저장소에 직접 충전될 수 있습니다.
    • 컴팩트한 출력* :- 모든 메타 데이터를 포함하는 단일 파일은 데이터 관리를 단순화합니다.

원제 : Environment Preparation

  • Visual Studio 또는 모든 호환되는 .NET IDE를 설정합니다.
  • 새로운 .NET 8 콘솔 애플리케이션 프로젝트를 만드십시오.
  • NuGet 패키지 관리자에서 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 Dataset Array와 함께.

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

단계 6 : JSON Array를 저장합니다.

JSON array를 파일에 저장합니다.

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를 분석 도구로 가져오기

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())

MongoDB에 대한 리뷰 보기

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

메모리 고려

매우 큰 데이터 세트로 작업 할 때 :

  • Batches의 프로세스: 파일을 100-500 파일의 패치로 분할합니다.
  • Stream Output: 매우 큰 흐름을 위해 스트림 기반 시리얼링을 사용합니다.
  • 디스플레이 파일: 데이터 세트를 추출 한 후 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 레이어 형식은 NoSQL 데이터베이스에 대량 수입을위한 이상적입니다.
  • 저장 효율성을 위해 큰 JSON 파일을 압축하는 것을 고려하십시오.
  • 스트리밍 시나리오의 경우 대신 NDJSON (뉴 라인 제한 JSON) 형식을 사용하는 것을 고려하십시오.

결론

이 튜토리얼은 Aspose.Medical을 사용하여 C#에서 여러 DICOM 파일을 하나의 JSON 라인으로 변환하는 방법을 보여줍니다.이 접근 방식은 분석, 데이터베이스 수입 및 데이터 파이프 라인의 통합을위한 효율적인 대량 데이터 수출을 가능하게합니다.

 한국어