2009-10-15 7 views
5

Ejecuto MATLAB en Linux y Windows XP. Mis archivos se sincronizan entre todas las computadoras que uso, pero debido a las diferencias en la estructura de directorios entre Linux y Windows, tengo que tener líneas de importación y exportación separadas para los diferentes sistemas operativos. En el momento en que acaba de comentar la línea para el sistema operativo equivocado, pero me pregunto si es posible escribir algo como:¿Es posible que una secuencia de comandos MATLAB se comporte de manera diferente según el sistema operativo en el que se está ejecutando?

if OS == Windows 
    datafile = csvread('C:\Documents and Settings\Me\MyPath\inputfile.csv'); 
else 
    datafile = csvread('/home/Me/MyPath/inputfile.csv'); 
end 

Ésta es también una cuestión más general que se aplica en los casos en que uno quiere ejecutar comandos del sistema desde MATLAB usando system('command').

+0

Gracias a todos por las excelentes respuestas. Mientras que Amro's fue la solución inmediata a mi problema, aprendí e implementé algo de las 4 respuestas hasta ahora (las de Amro, Mark, Edric y Adrian). –

Respuesta

7

Puede utilizar ispc/isunix/ismac funciones para determinar la plataforma o incluso utilizar la función computer para obtener más información sobre la máquina

if ispc 
    datafile = csvread('C:\Documents and Settings\Me\MyPath\inputfile.csv'); 
else 
    datafile = csvread('/home/Me/MyPath/inputfile.csv'); 
end 
+0

Gracias Amro! Eso es exactamente lo que estaba buscando. –

2

Si las estructuras de directorios se encuentran dentro En su directorio de inicio podría intentar construir una única ruta que pueda usarse en ambas plataformas de la siguiente manera (mi Matlab es un poco rudo, por lo que es posible que parte de la sintaxis no sea 10 0%):

  1. Ver here de cómo obtener el directorio inicial para el usuario
  2. crear la ruta de la siguiente manera (filesep es una función que devuelve el separador de archivo para la plataforma que está ejecutando sucesivamente)

    rutaarchivos = [userdir filesep 'MyPath' filesep 'inputfile.csv']

  3. Lea el archivo

    archivo de datos = csvread (ruta de archivo)

De lo contrario ir con la respuesta Amros. Es mas simple

+0

Gracias Mark. En este caso, las rutas no son idénticas debido a la forma en que Dropbox nombra su directorio en Linux frente a Windows, pero esta es una buena solución genérica para el problema y algo que aprecio saber. –

3

sólo para añadir un punto menor a las buenas respuestas existentes, que tienden a utilizar fileparts y fullfile en la construcción de caminos que necesitan trabajar en UNIX y en las variantes de Windows, como los que saben cómo tratar correctamente con barras.

4

Para seguir con la respuesta de Amro, solo iba a hacer un comentario pero tuve problemas con el formato del código.

Preferiría dividir la selección del sistema operativo del archivo leído.

if ispc 
    strFile = 'C:\Documents and Settings\Me\MyPath\inputfile.csv'; 
else 
    strFile = '/home/Me/MyPath/inputfile.csv'; 
end 

try 
    datafile = csvread(strFile); 
catch 
    % setup any error handling 
    error(['Error reading file : ',strFile]); 
end 

De esta forma si tengo que cambiar la forma en que se lee el archivo, tal vez con otra función, que es sólo una línea a cambiar. También mantiene el manejo de errores simple y local, una declaración de error puede manejar cualquier formato.

3

Además de usar las diversas técnicas aquí para tratar las diferencias de separador de ruta y archivo, debería considerar simplemente intentar evitar la codificación en rutas absolutas en sus scripts. Si debe usarlos, intente ponerlos en el menor número de archivos posible. Esto hará que su esfuerzo de portabilidad sea más simple.

Algunas ideas:

  • establecer una variable fileRoot en algún punto de entrada temprano o archivo de configuración. Use fullfile o cualquiera de las otras técnicas para construir una ruta completa.
  • Utilice siempre rutas relativas, en relación con el lugar donde el usuario está operando. Esto puede facilitar al usuario poner la entrada/salida donde se desee.
  • Parametrizar las rutas de entrada y salida en las entradas de funciones (por ejemplo, a través de un objeto de contexto específico del sistema).
Cuestiones relacionadas