【问题标题】:Scilab convert cell from matrix to stringScilab 将单元格从矩阵转换为字符串
【发布时间】:2021-04-17 16:48:44
【问题描述】:

你好,我是 Scilab 的初学者,我有家庭作业处理测量值,这些值保存在 csv 文件中。这是该文件中的值的示例:

&quot;Project Name:,&lt;Empty&gt;&quot;<br />
&quot;Company Name:,&lt;Empty&gt;&quot;<br />
&quot;User Name:,&lt;Empty&gt;&quot;<br />
&quot;Job Title:,&lt;Empty&gt;&quot;<br />
&quot;Location:,&lt;Empty&gt;&quot;<br />
&quot;Remarks:,&lt;Empty&gt;&quot;<br />
&quot;Date_Time,Test ID,Value_A,Unit_A,Function_A,MeterID_A,BluetoothID_A,Remarks_A&quot;<br />
&quot;2021-03-11 16:59:54,TP0,1968.2,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot;<br />
&quot;2021-03-11 16:59:55,TP1,1967.6,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot;<br />
&quot;2021-03-11 16:59:56,TP2,1966.9,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 16:59:57,TP3,1966.5,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 16:59:58,TP4,1966,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 16:59:59,TP5,1964,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:00,TP6,1945.5,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:01,TP7,1895.1,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:02,TP8,1856.6,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:03,TP9,1824.7,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:04,TP10,1803,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:05,TP11,1788.7,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:06,TP12,1773.5,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:07,TP13,1759.8,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:08,TP14,1752.9,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:09,TP15,1744.3,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:10,TP16,1734.4,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:11,TP17,1727.9,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:12,TP18,1723.8,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:13,TP19,1718.5,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:14,TP20,1713.5,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:15,TP21,1710.3,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:16,TP22,1708.4,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &quot;2021-03-11 17:00:17,TP23,1706.4,Ω,Res,U1252B-MY52430232,U1177A-238EBF,&quot; &nbsp;

我正在尝试使用这些命令仅获取电阻值:

 dates = mgetl(&#39;NTC2k2.csv&#39;) 
[start, final, match] = regexp(dates(1:$,1)),&#39;/[1-9.]*,Ω/&#39;)

但我的大问题是,当我尝试使用此代码时,它会抛出函数 regexp 不能与矩阵日期(1:$,1)一起使用的异常,请我不知道下一步如何进行。请帮帮我,非常感谢!

【问题讨论】:

  • 能否请您访问您的原始文件?我认为您发布的 html 在复制/粘贴时已损坏?
  • 当然,抱歉我现在注意到了这条评论。我把整个文件放在那里 :-) leteckaposta.cz/268429193
  • 用 `csvRead 读取这个文件是没有问题的,只要精确到分隔符是分号即可。

标签: string file matrix scilab


【解决方案1】:

我想您在粘贴 csv 文件时遇到了一些问题。如果文件具有以下内容,我认为是这种情况,因为 CSV 文件不应该包含 html 实体:

Project Name:,<Empty>
Company Name:,<Empty>
User Name:,<Empty>
Job Title:,<Empty>
Location:,<Empty>
Remarks:,<Empty>
Date_Time,Test ID,Value_A,Unit_A,Function_A,MeterID_A,BluetoothID_A,Remarks_A
2021-03-11 16:59:54,TP0,1968.2,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 16:59:55,TP1,1967.6,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 16:59:56,TP2,1966.9,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 16:59:57,TP3,1966.5,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 16:59:58,TP4,1966,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 16:59:59,TP5,1964,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:00,TP6,1945.5,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:01,TP7,1895.1,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:02,TP8,1856.6,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:03,TP9,1824.7,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:04,TP10,1803,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:05,TP11,1788.7,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:06,TP12,1773.5,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:07,TP13,1759.8,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:08,TP14,1752.9,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:09,TP15,1744.3,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:10,TP16,1734.4,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:11,TP17,1727.9,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:12,TP18,1723.8,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:13,TP19,1718.5,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:14,TP20,1713.5,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:15,TP21,1710.3,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:16,TP22,1708.4,Ω,Res,U1252B-MY52430232,U1177A-238EBF
2021-03-11 17:00:17,TP23,1706.4,Ω,Res,U1252B-MY52430232,U1177A-238EBF

那么获取电阻列的Scilab代码就很简单了(我假设你的文件名为so.csv

--> csvRead("so.csv",[],[],"double",[],[],[],7)(:,3)

ans  =

   1968.2
   1967.6
   1966.9
   1966.5
   1966.
   1964.
   1945.5
   1895.1
   1856.6
   1824.7
   1803.
   1788.7
   1773.5
   1759.8
   1752.9
   1744.3
   1734.4
   1727.9
   1723.8
   1718.5
   1713.5
   1710.3
   1708.4
   1706.4

最后一个值为7的参数表示文件头的行数,递归提取@9​​87654325@选择第三列。

【讨论】:

    【解决方案2】:

    您发布的示例CSV 似乎包含HTML 实体,例如&amp;quot; 代表双引号字符"&amp;#39; 代表单引号字符'&amp;lt;&amp;gt; 分别代表字符&lt;&gt;。如果这是您原始数据中的编码问题,那么您应该重新编码文件,因为CSV 文件中的数据应该用分隔符(通常是逗号或空格字符)分隔。

    现在说到重点,这里的问题是mgetl() 返回一个字符串向量,每个字符串代表文件中的一行。 但是,根据 Scilab 的 regexp 文档,第一个参数必须是字符串。因此,您应该将字符串向量连接成一个字符串,或者您可以将整个文件直接读入一个字符串,然后运行您的RegEx
    下面是一个 sn-p,它获取数据文件中的字节数,然后使用 mgetstr 将整个文件读入字符串,该函数接受要读取的字符数和通过 mopen 获得的文件描述符,然后运行RegEx 模式以获得电阻值。作为最后一步,它将匹配的字符串向量转换为双精度向量。

    byte_len = fileinfo('NTC2k2.csv')(1);
    str = mgetstr(byte_len, mopen('NTC2k2.csv'));
    [_, _, res_vals] = regexp(str,'/((?<=\,)\d+(\.\d+)?(?=\,Ω))+/');
    res_vals = strtod(res_vals);
    

    注意:该模式使用环视((?&lt;=...)(?=...))来断言紧接在电阻值之前和之后的是 ,,Ω。中间模式\d+(\.\d+)? 匹配电阻值的整数部分,如果有的话,匹配它的小数部分。

    【讨论】:

      【解决方案3】:

      非常感谢! :-) 顺便说一句,如果我从命令中正确理解,没有注意分隔符(在这种情况下是逗号,)所以我猜逗号被设置为默认分隔符吗?

      【讨论】:

      • 是的,但如果分隔符不同(分号或其他),您可以更改此设置。这是第二个参数:csvRead(filename, separator, decimal, conversion, substitute, regexpcomments, range, header)。更多详情请查看csvRead的帮助页面。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      相关资源
      最近更新 更多