GNU Octave:使用textscan(...)读取NA值的数据

时间:2018-02-09 08:50:10

标签: octave textscan

我需要读取ASCII文件中的数据,其中缺失值为NA。使用textscan(...)似乎不起作用,因为textscan(...)似乎在第一次出现NA时停止读取/解析。

以下是该问题的简单演示:

x = textscan ( "1 ; 2 ; 3\n4 ; NA ; 6" , '%d %d %d' , 'Delimiter' , ';' , 'TreatAsEmpty' , 'NA' , 'ReturnOnError' , false )
error: textscan: Read error in field 2 of row 2

我还试图告诉textscan(...)将NA解释为"空值",但没有运气:

public string UrlLengthen(string url)
{
    string newurl = "";
    bool redirecting = true;

    while (redirecting)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(newurl);
            request.AllowAutoRedirect = false;
            request.UserAgent = "Mozilla/5.0 (Windows; U; Win98; en-US; rv:0.9.2)";
           //this user agent is providing results for short urls
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            string uriString = response.GetResponseHeader("location");
            if ((int)response.StatusCode == 301 || (int)response.StatusCode == 302)
            {
                uriString = response.Headers["Location"];
                //Log.Debug("Redirecting " + newurl + " to " + uriString + " because " + response.StatusCode);
                newurl = uriString;
                // and keep going
            }
            else
            {
                // Log.Debug("Not redirecting " + url + " because " + response.StatusCode);
                redirecting = false;
            }

            newurl = uriString;
        }
        catch (Exception ex)
        {
            ex.Data.Add("url", newurl);
            // Exceptions.ExceptionRecord.ReportWarning(ex); // change this to your own
            redirecting = false;
        }
    }

    return sb.ToString();
}

有人可以解释一下发生了什么,或者如何使其发挥作用?

请注意,这只是一个简单的例子来说明问题。我文件中的数据格式有点复杂,我真的依赖textscan(...)来解析它;我不认为我可以轻松地做到没有文本扫描(...)。

(我正在运行Octave 4.2.1。)

1 个答案:

答案 0 :(得分:1)

NA是针对浮点数定义的,因此您应使用'%f'转换说明符而不是'%d'

x = textscan ( "1 ; 2 ; 3\n4 ; NA ; 6" , '%f %f %f' ,
    'Delimiter' , ';' , 'ReturnOnError' , false )