#csv #julia
#csv #джулия
Вопрос:
Я хотел бы импортировать CSV-файл ( file.csv
) в виде матрицы в Julia, чтобы отобразить его в виде тепловой карты с использованием GR. Мой CSV-файл содержит 255 строк и 255 записей в каждой строке. Вот некоторые целые строки из CSV-файла, чтобы проиллюстрировать формат строк:
file.csv
-1.838713563526794E-8;-1.863045549663876E-8;-2.334704481052452E-8 ...
-1.7375447279939282E-8;-1.9194929690414267E-8;-2.0258124812468942E-8; ...
⋮
-1.1706980663321613E-8;-1.6244768693064608E-8;-5.443335580296977E-9; ...
Примечание: elipsis (…) не являются частью CSV-файла, скорее они указывают, что целые значения были опущены.
Я попытался импортировать файл в виде матрицы, используя следующую строку m = CSV.read("./file.csv")
, но в результате получается вектор размером 255 на 1, а не матрица размером 255 на 255. Кто-нибудь знает эффективный способ импорта файлов CSV в виде матриц в Julia?
Ответ №1:
Вы можете использовать
using DelimitedFiles
m = readdlm("./file.csv", ';', Float64)
(последний аргумент, указывающий тип, можно опустить, если хотите Float64
)
Комментарии:
1. Ваши решения частично решают проблему. При вводе
readdlm("./height.csv", ';')
создается матрица типа 255 на 255Array{Any,2}
с элементами CSV-файла. Однако, когда я пытаюсь преобразовать целые значения вFloat64
, вместо этого вводяreaddlm("./height.csv", ';', Float64)
, я сталкиваюсь с ошибкой «Ошибка загрузки: в строке 1, столбец 1: ошибка исключения («запись файла» ufeff-1.838713563526794E-8″не может быть преобразована в Float64″)».2. @K.Claesson может возникнуть проблема с файлом, спецификацией в начале. Сохранение файла как UTF8 без спецификации может заставить его работать
readdlm
.3. @hckr Действительно, сохранение файла как UTF8 без спецификации заставило его работать
readdlm
.
Ответ №2:
m = CSV.read("./file.csv")
возвращает a DataFrame
.
Если CSV.jl
файл считывается правильно, так что все столбцы m
имеют тип Float64
, не содержащий missing
s, то вы можете преобразовать m
в Float64
матрицу с Matrix{Float64}(m)
помощью, или получить матрицу с одной строкой:
m = Matrix{Float64}(CSV.read("./file.csv", header=0, delim=';'))
# or with piping syntax
m = CSV.read("./file.csv", header=0, delim=';') |> Matrix{Float64}
readdlm
однако обычно этого должно быть достаточно, и первое решение для таких простых CSV-файлов, как у вас.
Комментарии:
1. Пытаясь импортировать CSV-файл, следуя вашему методу, я сталкиваюсь с ошибкой «Ошибка метода: невозможно
convert
преобразовать объект типа String в объект типа Float64″. Я подозреваю, что причинаm = readdlm("./file.csv", ';', Float64)
, по которой у меня не работает, та же, что и причина этой ошибки.2. Сохранение файла как UTF8 без спецификации позволило ему работать
readdlm
, но подход сCSV.read
по-прежнему выдает «Ошибка метода: невозможно преобразовать объект типа String в объект типа Float64».3. @K.Claesson Возможно, вам потребуется ввести
header=0, delim=';'
аргументы ключевого слова для вашего файла, поскольку по умолчаниюCSV.jl
будет выполняться поиск файла с,
разделителем as и заголовком. и, как и в моем обновленном ответе. IIRCCSV.jl
уже обрабатывает спецификацию, поэтому это не должно быть проблемой.
Ответ №3:
2022 Ответ
Не уверен, были ли внесены изменения CSV.jl
, однако, если я это сделаю CSV.read("file.csv")
, это приведет к ошибке
provide a valid sink argument, like 'using DataFrames; CSV.read(source, DataFrame)'
Однако вы можете использовать тот факт, что ему требуется любой Tables.jl
совместимый тип:
using CSV, Tables
M = CSV.read("file.csv", Tables.matrix, header=0)