Импорт CSV-файла в виде матрицы

#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 на 255 Array{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 и заголовком. и, как и в моем обновленном ответе. IIRC CSV.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)