'CSV file. Reading. No column structure. GE. CT protocols
I have a CSV file of CT protocols from CT scanner.
I would like to read parameters of CT scanning and trasfrom data to a new table for comparison. But the structure of the file doesn't is not column structure. I could say that it is a string strucutre.
Threre are example of the first two protocols:
ADULT HEAD 1.1 Head (adult) 1.25
Exam Dose Settings, ExamCtdi,ExamDLP, 56.1357,8211.25,
Series 1,Scout,HeadFirst,Supine AutoStore,Gating,SeriesLevelCopy,Injector, No,No,No,No
Scan,kV,mA,Start,End,Plane,Message,Light,Timer, 1,120,20,S180,I180,0,0,No,No,
Series 2,Axial,HeadFirst,Supine AutoStore,Gating,SeriesLevelCopy,SmartPrep,Biopsy,Injector, No,No,Yes,No,No,No
Series 2 Group 1 Scan Settings Group,Images,Speed,Type,Start,End,Thick,Speed,Rows,Int,HiRes,Shuttle,Tilt,SFOV,kV,mA,Message,Light,Timer,CTDI NV,CTDI,DLP NV,DLP, 1,1161,1.0,Helical,S150.0,I1300.0,1.25,5.625,16,1.25,No,No,S0.0,Large,120,340,No,No,No,NA,56.1357,NA,8211.25,
Series 2 Group 1 Recon 1 Settings Group,DFOV,A/P,R/L,Filter,Type,Vari,D3D,DMPR,Neuro,ASIR,IQEnhance,GSI,Flip, 1,50.0 D ,A0.0 D ,R0.0 D ,Standard,Full,No,No,No,No,None,No,No,None,
Series 3 Group 1 Recon 2 Settings Group,Images,Type,Start,End,Thick,Int,DFOV,A/P,R/L,Filter,Type,ASIR,IQEnhanced,GSI,Flip, 1,1161,Helical,S150.0 D ,I1300.0 D ,1.25,1.25,50.0 D ,A0.0 D ,R0.0 D ,Standard,Full,None,No,No,None
Series 7 Group 1 Recon 6 Settings Group,Images,Type,Start,End,Thick,Int,DFOV,A/P,R/L,Filter,Type,ASIR,IQEnhanced,GSI,Flip, 1,1161,Helical,S150.0 D ,I1300.0 D ,1.25,1.25,50.0 D ,A0.0 D ,R0.0 D ,Soft,Full,None,Yes,No,None
Series 8 Group 1 Recon 7 Settings Group,Images,Type,Start,End,Thick,Int,DFOV,A/P,R/L,Filter,Type,ASIR,IQEnhanced,GSI,Flip, 1,1161,Helical,S150.0 D ,I1300.0 D ,1.25,1.25,50.0 D ,A0.0 D ,R0.0 D ,Soft,Full,None,Yes,No,None
ADULT HEAD 1.2 Head Contrast (adult) 1.25 N+C
Exam Dose Settings, ExamCtdi,ExamDLP, 110.533,2351.6,
Series 1,Scout,HeadFirst,Supine AutoStore,Gating,SeriesLevelCopy,Injector, No,No,No,No
Scan,kV,mA,Start,End,Plane,Message,Light,Timer, 1,120,20,S180,I180,0,0,No,No,
Series 2,Axial,HeadFirst,Supine AutoStore,Gating,SeriesLevelCopy,SmartPrep,Biopsy,Injector, No,No,Yes,No,No,No
Series 2 Group 1 Scan Settings Group,Images,Speed,Type,Start,End,Thick,Speed,Rows,Int,HiRes,Shuttle,Tilt,SFOV,kV,mA,Message,Light,Timer,CTDI NV,CTDI,DLP NV,DLP, 1,161,1.0,Helical,S150.0,I50.0,1.25,5.625,16,1.25,No,No,S0.0,Large,120,340,No,No,No,NA,55.2667,NA,1175.8,
Series 2 Group 1 Recon 1 Settings Group,DFOV,A/P,R/L,Filter,Type,Vari,D3D,DMPR,Neuro,ASIR,IQEnhance,GSI,Flip, 1,50.0,A0.0,R0.0,Standard,Full,No,No,No,No,None,No,No,None,
Series 3 Group 1 Recon 2 Settings Group,Images,Type,Start,End,Thick,Int,DFOV,A/P,R/L,Filter,Type,ASIR,IQEnhanced,GSI,Flip, 1,161,Helical,S150.0 D ,I50.0 D ,1.25,1.25 D ,50.0 D ,A0.0 D ,R0.0 D ,Standard,Full,None,No,No,None
Series 7 Group 1 Recon 6 Settings Group,Images,Type,Start,End,Thick,Int,DFOV,A/P,R/L,Filter,Type,ASIR,IQEnhanced,GSI,Flip, 1,161,Helical,S150.0 D ,I50.0 D ,1.25,1.25 D ,50.0 D ,A0.0 D ,R0.0 D ,Soft,Full,None,Yes,No,None
Series 8 Group 1 Recon 7 Settings Group,Images,Type,Start,End,Thick,Int,DFOV,A/P,R/L,Filter,Type,ASIR,IQEnhanced,GSI,Flip, 1,161,Helical,S150.0 D ,I50.0 D ,1.25,1.25 D ,50.0 D ,A0.0 D ,R0.0 D ,Soft,Full,None,Yes,No,None
Series 9,Axial,HeadFirst,Supine AutoStore,Gating,SeriesLevelCopy,SmartPrep,Biopsy,Injector, No,No,Yes,No,No,No
Series 9 Group 1 Scan Settings Group,Images,Speed,Type,Start,End,Thick,Speed,Rows,Int,HiRes,Shuttle,Tilt,SFOV,kV,mA,Message,Light,Timer,CTDI NV,CTDI,DLP NV,DLP, 1,161,1.0,Helical,S150.0,I50.0,1.25,5.625,16,1.25,No,No,S0.0,Large,120,340,No,No,No,NA,55.2667,NA,1175.8,
Series 9 Group 1 Recon 1 Settings Group,DFOV,A/P,R/L,Filter,Type,Vari,D3D,DMPR,Neuro,ASIR,IQEnhance,GSI,Flip, 1,50.0 D ,A0.0 D ,R0.0 D ,Soft,Full,No,No,No,No,None,Yes,No,None,
Is there a convinient way to read the data from file with a such structure? I mean that I don't want to read file string by string write some logic expression with using re module and so on. Maybe you have some useful advise for reading if there are no any usfeul libs.
Solution 1:[1]
Not a table exactly, but this will transform your csv into a dict which you can then use for your purposes. (The json import is simply for print formatting and can be excluded.)
import json
def read_scan():
file = open('scan.csv', 'r')
data = {}
key = ""
for line in file:
line = line.replace("\n", "")
if "," not in line and len(line):
key = line
if key not in data:
data[key] = []
elif len(line):
line_array = line.split(",")
line_data = {}
half = int(len(line_array) / 2)
for index in range(0, half):
line_data[line_array[index].strip()] = line_array[half + index]
data[key].append(line_data)
print(json.dumps(data, indent=4))
read_scan()
Output:
{
"ADULT HEAD 1.1 Head (adult) 1.25": [
{
"Exam Dose Settings": " 56.1357",
"ExamCtdi": "8211.25",
"ExamDLP": ""
},
{
"Exam Dose Settings": " 56.1357",
"ExamCtdi": "8211.25",
"ExamDLP": ""
},
{
"Exam Dose Settings": " 56.1357",
"ExamCtdi": "8211.25",
"ExamDLP": ""
},
{
"Series 1": "SeriesLevelCopy",
"Scout": "Injector",
"HeadFirst": " No",
"Supine AutoStore": "No",
"Gating": "No"
},
{
"Series 1": "SeriesLevelCopy",
"Scout": "Injector",
"HeadFirst": " No",
"Supine AutoStore": "No",
"Gating": "No"
},
{
"Series 1": "SeriesLevelCopy",
"Scout": "Injector",
"HeadFirst": " No",
"Supine AutoStore": "No",
"Gating": "No"
},
{
"Series 1": "SeriesLevelCopy",
"Scout": "Injector",
"HeadFirst": " No",
"Supine AutoStore": "No",
"Gating": "No"
},
{
"Series 1": "SeriesLevelCopy",
"Scout": "Injector",
"HeadFirst": " No",
"Supine AutoStore": "No",
"Gating": "No"
},
...
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Dmitriy |
