leer un archivo de texto en un array (file de 0 y 1)

Tengo un archivo de texto que contiene aleatorios de 0 y 1, y quiero leerlo en Matlab y obtener cada elemento en un array

gol : Tengo dos archivos de texto que quiero comparar y ver si son idénticos y cuánta diferencia hay, de hecho, los dos archivos son: 1) archivo original que envío a través de una línea de comunicación 2) el archivo recibido debe ser idéntico al archivo enviado

Ejemplo de mi código:

for i=1:1:size

if (send[i] ~= received[i]) error++;
end

pero necesito saber cómo obtener estos dos arrays de los archivos de texto, donde todos los "0" y "1" están en una línea

Pregunta hecha hace 3 años, 5 meses, 1 días - Por codesculptor3f6e


4 Respuestas:

  • Ya que quieres comprobar que el contenido de los dos archivos es el mismo, no creo que necesites preocuparte por el formato de sus contenidos o la secuencia de ceros y otros, deberían ser simplemente idénticos. Puede utilizar el siguiente código para leer todo el archivo de texto y almacenarlo en un char vector:

    C = char(join(readlines(filename), ''));
    

    Para comparar el contenido de dos archivos y encontrar el porcentaje de error puede hacer lo siguiente:

    act =  char(join(readlines(actualfilename), ''));
    exp = char(join(readlines(expectedfilename), ''));
    err = (sum(act~=exp))/length(act);
    

    Pero también debe detectar si dos archivos contienen diferentes caracteres:

    act =  char(join(readlines(actualfilename), ''));
    exp = char(join(readlines(expectedfilename), ''));
    al = length(act); % actual length
    el = length(exp); % expected length
    dl = abs(al-el);
    if (dl>0)
        ml = min(al, el); % min length
        act = act(1:ml); % shorten act if needed
        exp = exp(1:ml); % shorten exp if needed
    end
    err = (sum(act~=exp)+dl)/al % error
    

    Tenga en cuenta que en el segundo caso, si un personaje se añade o se pierde en el centro del archivo, todos los caracteres posteriores serán considerados como error.

    Respondida el Dec 16, 2020 a las 09:33 - por quantumquasar

    Votos positivos: 0 | Votos negativos: 0

  • Lectura en los archivos de texto:

    Si el archivo de texto está configurado con espacios o rupturas de línea:

    Text.txt (rupciones en línea)

    0
    1
    0
    1
    1
    

    Texto.txt (espacios)

    1 0 1 0 1 1
    

    El escaneado en los datos se puede hacer utilizando el fscanf() función con especificación de formato %d indicado para escanear en el archivo como enteros.

    File_Name = "Text.txt";
    File_ID = fopen(File_Name);
    
    Binary = fscanf(File_ID,'%d');
    

    Si el archivo de texto tiene los caracteres al lado/concatenados en la misma línea sin espacios:

    Text.txt (línea single, sin espacios)

    01011
    

    Escanear el archivo de texto se puede hacer utilizando la especificación de formato, %s indicó leer el archivo como una cadena. Esta cadena se puede dividir y convertir en un array utilizando split(), cell2mat() y str2num().

    split() → Se divide la cadena en un array celular con bits individuales/binarios
    cell2mat() → Convierte la matriz celular en una matriz de caracteres
    str2num() → Convierte la matriz de caracteres en una matriz doble numérica

    File_Name = "Text.txt";
    File_ID = fopen(File_Name);
    
    Binary = fscanf(File_ID,'%s');
    Binary = split(Binary,'');
    Binary = str2num(cell2mat(Binary(2:end-1))).';
    

    Comparando con Evaluar Cantidad de Errores:

    La comprobación de errores se puede hacer comparando los arrays lógicamente en una forma basada en elementos. Luego usando el nnz() (número de no ceros) función podemos contar el número de veces que la condición es verdadera, "1". Aquí la condición es cuando las dos señales binarias Binary_1 y Binary_2 no iguales entre sí.

    Código Snippet:

    Error = nnz(Binary_1 ~= Binary_2);
    Error
    

    Full Script Option 1 (archivo de texto de rupturas/espacios):

    File_Name = "Text_1.txt";
    File_ID = fopen(File_Name);
    Binary_1 = fscanf(File_ID,'%d');
    fclose(File_ID);
    
    File_Name = "Text_2.txt";
    File_ID = fopen(File_Name);
    Binary_2 = fscanf(File_ID,'%d');
    fclose(File_ID);
    
    clearvars -except Binary_1 Binary_2
    
    Error = nnz(Binary_1 ~= Binary_2);
    Error
    

    Full Script Option 2 (línea única, sin archivo de texto de espacios):

    File_Name = "Text_1.txt";
    File_ID = fopen(File_Name);
    
    Binary_1 = fscanf(File_ID,'%s');
    Binary_1 = split(Binary_1,'');
    Binary_1 = str2num(cell2mat(Binary_1(2:end-1))).';
    
    File_Name = "Text_2.txt";
    File_ID = fopen(File_Name);
    Binary_2 = fscanf(File_ID,'%s');
    Binary_2 = split(Binary_2,'');
    Binary_2 = str2num(cell2mat(Binary_2(2:end-1))).';
    fclose(File_ID);
    
    clearvars -except Binary_1 Binary_2
    
    Error = nnz(Binary_1 ~= Binary_2);
    Error
    

    Ran utilizando MATLAB R2019b

    Respondida el Dec 16, 2020 a las 09:40 - por quantumcoder403a

    Votos positivos: 0 | Votos negativos: 0

  • Para leer un archivo de texto que contiene solo 0s y 1s en Matlab y guardarlos en un array, puedes utilizar la función textread de la siguiente manera:

    matlab
    % Leer el archivo de texto
    fileID = fopen('nombre_archivo.txt','r');
    A = textread('nombre_archivo.txt','%s');
    
    % Convertir de texto a un array de números
    array = str2double(A{1});
    disp(array);
    

    En este código, 'nombre_archivo.txt' debe ser reemplazado por la ruta y nombre de tu archivo de texto. El código leerá el archivo línea por línea y guardará cada línea como un string en la variable A. Luego, convertirá ese string a un array de números utilizando la función str2double, y lo guardará en la variable array.

    Para comparar dos archivos de texto y encontrar la diferencia entre ellos, puedes utilizar la función isequal en Matlab de la siguiente manera:

    matlab
    % Leer los dos archivos de texto
    file1 = textread('archivo_enviado.txt','%s');
    file2 = textread('archivo_recibido.txt','%s');
    
    % Comparar los dos archivos
    if isequal(file1, file2)
        disp('Los archivos son idénticos');
    else
        error = sum(cellfun(@numel, regexp(file1{1},'1')) - cellfun(@numel, regexp(file2{1},'1')));
        disp(['Los archivos son diferentes, con una diferencia de: ', num2str(error)]);
    end
    

    En este código, 'archivoenviado.txt' y 'archivorecibido.txt' deben ser reemplazados por las rutas y nombres de tus archivos de texto respectivamente. La función isequal compara los dos archivos línea por línea y devuelve un valor lógico indicando si son idénticos o no. Si los archivos no son idénticos, calcula la diferencia en la cantidad de unos (1) en los dos archivos para mostrar cuánta diferencia hay entre ellos.

    Respondida el Dec 17, 2020 a las 09:32 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • 2548d

    Respondida el Dec 17, 2020 a las 09:39 - por Gemini

    Votos positivos: 0 | Votos negativos: 0