2017-11-10 2 views
1

텍스트 또는 숫자로 구성된 csv 파일이 있습니다. 그러나 일부 이미지는 아래 이미지 ("< <"K.O)와 같이 손상되었습니다. Matlab을 통해 CSV 파일을 열 때 (가져 오지 않고) 번호로 변환하고 정의 된 값을 "< <"K.O를 NaN으로 정의합니다. 그러나 스크립트를 통해 파일을 읽을 때 나는 다음과 같이 썼습니다.숫자 텍스트를 포함하는 열의 내용을 숫자로 변환합니다.

opts = detectImportOptions(filedir); 
table = readtable(filedir,opts); 

문자 배열로 읽습니다. 필자는 여러 다른 csv 파일 (열이 다르므로)을 textscan 대신 사용하려고합니다 (파일 형식이 필요하고 파일 형식이 각 CSV 파일마다 다르기 때문에). 숫자 텍스트를 포함하는 열의 내용을 자동으로 숫자로 변환 할 수있는 방법이 있습니까?

data

답변

0

당신이 table에 저장된 데이터를 가정하면, str2double를 사용하여 숫자 값을 문자 배열의 각 열을 변환하는 시도 할 수 있습니다. 숫자 값으로 변환하지 않는 값 (빈 항목, 단어, 숫자가 아닌 문자열 등)은 NaN으로 변환됩니다.

변환을 자동으로 수행하려면 으로 변환되는 모든 열NaN 값이 변경되지 않아야합니다. 이 경우 데이터는 변환 할 수없는 모든 문자 배열이거나 이미 숫자로되어있을 가능성이 큽니다.

T = table((1:5).', {'Y'; 'N'; 'Y'; 'Y'; 'N'}, {'pi'; ''; '1.4e5'; '1'; 'A'}); 

T = 

    Var1 Var2  Var3 
    ____ ____ _______ 

    1  'Y'  'pi' 
    2  'N'  ''  
    3  'Y'  '1.4e5' 
    4  'Y'  '1'  
    5  'N'  'A' 

는 위의 코드에 의해 다음으로 변환됩니다 : 테스트, 다음 샘플 데이터로

for varName = T.Properties.VariableNames 
    numData = str2double(T.(varName{1})); 
    if ~all(isnan(numData)) 
    T.(varName{1}) = numData; 
    end 
end 

: 그 가정을 감안할 때,이 일반적인 변환은 모든 테이블 T에 적용 할 수

T = 

    Var1 Var2  Var3 
    ____ ____ ______ 

    1  'Y'  NaN 
    2  'N'  NaN 
    3  'Y'  140000 
    4  'Y'   1 
    5  'N'  NaN 
+0

문제는 많은 csv 파일과 많은 열 (일부 텍스트는 일부 이중 값)이며 모든 데이터 집합 (for 루프)에서 동일한 작업을 수행하려고합니다. 따라서 table.grade와 같은 특정 열이 아니어야합니다. 사실, matlab에 uiimport에 의해 만들어진 테이블은 내가 원하는 것과 같지만 어떤 함수도 사용자 인터페이스없이 같은 출력을 생성하지 못합니다. – Pumpkin

+0

@Pumpkin : 모든 * 비 숫자 열을 숫자로 변환 하시겠습니까, 아니면 숫자가 아닌 열이 있어야합니까? – gnovice

+0

예 숫자가 아닌 열이 있어야합니다 (예 : 학생 또는 상태 전공) – Pumpkin

0

지금까지 내가 귀하의 의견에서 이해할 수있는, 이것은 당신이 실제로 무엇을 찾고 있습니다 :

for i = 1:numel(files) 
    file = fullfile(folder,files(i).name)); 

    opts = detectImportOptions(file); 
    idx = strcmp(opts.VariableNames,'Grade'); 

    if (any(idx)) 
     opts.VariableTypes(idx) = {'double'}; 
    end 

    tabs(i) = readtable(file,opts); 
end 
+0

간단한 해결책이 없습니다. 각 열의 최초의 null이 아닌 행 값을 선택하여 "^ [0-9] + (\\. [0-9] +)"와 같은 정규 표현식과 비교할 수 있습니다. (https://it.mathworks.com/help/matlab/ref/regexp.html 참조). 일치하는 항목이 양수이면 내 메서드를 적용하여 변수 유형을 현재 열의 'double'으로 변경할 수 있습니다. –

관련 문제