Файлы формата CSV широко используются при работе с базами данных (например, MySQL позволяет импорт и экспорт записей в этом формате). Как правило, файл в таком формате содержит в себе множество значений, например, это могут быть результаты какого-либо эксперимента.
Большинство функций Scilab работает с переменными и массивами. Поэтому, нам надо загрузить данные из CSV-файла в массивы и переменные Scilab. В Scilab нет функций для работы непосредственно с файлами CSV, однако, в нём достаточно функций для удобной работы с любыми файлами, и поэтому можно без труда написать простенькую функцию загрузки значений из файла CSV.
Пусть у нас CSV-файл, из которого нам надо загрузить данные, имеет следующую структуру:
1230521285 1285 1230606038 1289 1230629291 1290 1230692491 1291 1230778569 1293
Каждая строка - это пара чисел: первое число есть время в формате UNIX, а второе - значение некоторой переменной, измеренное в этот промежуток времени. Числа разделены пробелом. Необходимо считать эти числа в массивы x(i) и y(i) соответственно.
Вот код функции, реализующей это:
function [x, y] = readfile(filename) [fd,err] = mopen(filename,'r'); i = 1; while ~meof(fd) x(i) = mfscanf(fd, '%lg'); y(i) = mfscanf(fd, '%lg'); i = i + 1; end; mclose(fd); x = x'; y = y'; endfunction
Если у вас есть какие-то дополнения или комментарии, мы будем рады их услышать - комментируйте данную статью!
Комментарии
Re: Работа с CSV-файлами в Scilab
Срд, 22.04.2009, 09:25 — comm (не проверено)Спасибо, очень полезная функция, еще б расширить, для произвольного колличества столбцов;) а вообще, просто и наглядно.
Белее простой способ загрузки данных из файлов
Срд, 22.12.2010, 07:16 — Roman (не проверено)Здравствуйте! Несоменно, предлженный Вами способ чтения данных из csv-файла полезный, а в некоторых ситуациях, единственно возможный. Но, если у файла структура простая (как раз такая, как у вас), то есть более простой способ чтения данных из этого файла – функция read. Пусть, например, нужно построить графики составляющих профиля скорости U потока. Составляющих три - Ux, Uy, Uz. OpenFOAM создаёт файл вида:
0.000408163 0.00972335 -0.00883578 -2.14563e-05
0.000816327 0.0194467 -0.0176716 -4.29125e-05
0.00122449 0.0291701 -0.0265073 -4.07586e-05
0.00163265 0.0388934 -0.0353431 -1.92873e-05
0.00204082 0.0506507 -0.0438358 -4.71581e-05
...
Значения 1 столбца будут будут использованы в качестве значений по оси абсцисс. Второй, третий и четвёртый столбцы – значения составляющих скорости по x, y и z соответственно. Итак, читаем данные и строим графики
U=read('datafile.xy', -1, 4); // читаем файл - 4 столбца и все строки (см. help)
x=U(:,1); // вектор значений для оси абсцисс
Ux=U(:,2); // вектор значений для оси ординат 1-го графика
Uy=U(:,3); // вектор значений для оси ординат 2-го графика
Uz=U(:,4); // вектор значений для оси ординат 3-го графика
plot(x,Ux); // строится 1-й график
plot(x,Uy); // строится 2-й график
plot(x,Uz); // строится 3-й график
Ооо, спасибо! :) Ваш пример
Суб, 25.12.2010, 14:12 — andyceoОоо, спасибо! :)
Ваш пример более компактный, конечно. Однако передо мной, в свое время, стояла задача сделать более-менее универсальную функцию.
Но все равно, ваше решение - в копилку!
Отправить комментарий