【问题标题】:Read csv data directly from url in MatlabMatlab中直接从url读取csv数据
【发布时间】:2013-09-06 16:40:43
【问题描述】:

我在从 Matlab 的数据库中读取数据时遇到一些问题。我用来下载数据的 url 链接给出了一个分号分隔的文本文件,我需要 Matlab 来识别这些数据并以struct 格式(因为数据具有不同的类)进行相应的排列。 我已经使用urlread 并且可以成功下载数据,唯一的问题是我将所有数据作为字符串获取到一个单元格中,我需要将这些数据作为表格获取并且组织良好。

基本上我想知道是否可以像 R 中的 read.csv 函数一样将数据从 url 加载到 Matlab 中,您只需将 url 放在文件名应该去的地方并定义数据的方式是分隔和中提琴,你会得到你的data.frame,你的所有数据都按照它应该的方式完美地组织起来。

我想有办法在使用 urlread 后解释字符串,并以某种方式将其转换为有组织的 struct 变量,但必须有一种方法可以像 R 那样直接从 url 读取它。

【问题讨论】:

    标签: r matlab csv import


    【解决方案1】:

    查看一个名为dlmread 的函数。这将允许您输入一串数据,告诉它分隔符是什么,它应该会输出您需要的内容。

    dlmread

    results = dlmread('http://someurl.com/somefile.txt',';')
    

    【讨论】:

    • dlmread 仅适用于数字数据,它会创建一个矩阵。我需要创建一个结构,因为 url 中的数据有不同的类
    • @RabidHealer 原发帖人并没有真正说明数据的类型,所以我只是假设它是数字
    • 我加了一句说明数据有不同的类。
    • 我尝试在 MATLAB R2015b 中使用 URL 调用 dlmread(),但它返回了 I/O 错误。我相信它只能从本地文件系统读取,不能从 HTTP 读取。
    • @Nayuki 如果不详细说明错误说明的内容,我无法说出问题所在,但这个答案是在 2013 年写的,所以 MATLAB 可能在我写答案和当他们发布 R2015b
    【解决方案2】:

    这是一段代码,它将从网络 (urlread) 读取 csv 数据,使用 textscan 扫描并将数据格式化为单元格(允许字符串和标量),然后将单元格转换为带有cell2struct 的结构。创建的结构保持textscan 格式。

    请注意,您必须定义textscan 格式和cell2struct 输入以适合您的数据。

    block = urlread('http://hci.stanford.edu/jheer/workshop/data/florida2000/Florida2000.csv');
    C = textscan(block,'%s%s%f%s%f','HeaderLines',1,'EndOfLine','\n');
    S = cell2struct(C,{'county','technology','columns','category','ballots'},2)
    

    这是佛罗里达州 2000 年总统选举结果(.csv,938 个数据点)

    county,technology,columns,category,ballots
    Alachua,Optical,1,under,217
    Alachua,Optical,1,over,105
    Alachua,Optical,1,Bush,34124
    Alachua,Optical,1,Gore,47365
    Alachua,Optical,1,Browne,658
    Alachua,Optical,1,Nader,3226
    Alachua,Optical,1,Harris,6
    ...
    

    这将产生

    S = 
    
        county: {938x1 cell}    %string
    technology: {938x1 cell}    %string
       columns: [938x1 double]  %double
      category: {938x1 cell}    %string
       ballots: [938x1 double]  %double
    

    编辑

    对于双引号文本,您可以使用%q 而不是%s 调用textscan (FormatSpec options),就像这样

    C = textscan(fileID,'%q%f');
    

    【讨论】:

    • 这个解决方案有效,我必须为每一列定义数据类和名称,所以它不像在 R 中那么简单。但无论如何它都能满足我的要求,对 mathworks 的一个好建议是在 csvread 函数中包含与 url 的兼容性。感谢您的帮助!
    • @RabidHealer 这会涉及太多的工作(支持所有常见的协议,如 HTTP、FTP、TFTP 等...),因此限制每个命令/功能/工具通常更有意义有自己的工作范围。如果您想读取远程文件,请使用适当的工具(例如urlread)获取它,然后使用另一个工具对其进行解析。
    • 我在 Octave 3.8.2 中尝试过这个,但它不起作用,因为它忽略了“HeaderLines”。 Octave 输出“警告:textscan:从字符串读取时忽略'headerlines'”并实际上尝试解析标题。这是 Matlab 中不存在的 Octave 怪癖吗?任何人都知道如何在不读取文件时让它在 Octave 中工作?
    • 标准 csv 文件中的双引号怎么样?这个答案不完整。
    • @hyprfrcb 请查看编辑。 textscan 具有阅读引用文本的本机选项。
    猜你喜欢
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2016-08-28
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-04-29
    相关资源
    最近更新 更多