Scilab 将单元格从矩阵转换为字符串
Scilab convert cell from matrix to string
你好,我是 Scilab 的初学者,我有作业处理测量值,这些值保存在 csv 文件中。这是该文件中值的示例:
"Project Name:,<Empty>"<br />
"Company Name:,<Empty>"<br />
"User Name:,<Empty>"<br />
"Job Title:,<Empty>"<br />
"Location:,<Empty>"<br />
"Remarks:,<Empty>"<br />
"Date_Time,Test ID,Value_A,Unit_A,Function_A,MeterID_A,BluetoothID_A,Remarks_A"<br />
"2021-03-11 16:59:54,TP0,1968.2,Ω,Res,U1252B-MY52430232,U1177A-238EBF,"<br />
"2021-03-11 16:59:55,TP1,1967.6,Ω,Res,U1252B-MY52430232,U1177A-238EBF,"<br />
"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,"
我正在尝试使用这些命令仅获取电阻值:
dates = mgetl('NTC2k2.csv')
[start, final, match] = regexp(dates(1:$,1)),'/[1-9.]*,Ω/')
但我的大问题是,当我尝试使用此代码时,它抛出函数 regexp 无法与矩阵日期 (1:$,1) 一起使用的异常,请问我不知道下一步如何进行。请帮帮我,非常感谢!
您发布的示例 CSV
似乎包含 HTML
个实体,例如 "
表示双引号字符 "
,'
表示单引号字符 '
、<
和 >
,分别表示字符 <
和 >
。如果这是原始数据中的编码问题,那么您应该重新编码文件,因为 CSV
文件中的数据应该用分隔符(通常是逗号或 space 字符)分隔。
现在进入重点,这里的问题是 mgetl()
returns 一个字符串向量,每个字符串代表文件中的一行。
但是,根据 regexp 的 Scilab 文档,第一个参数必须是字符串。因此,您应该将字符串向量连接成一个字符串,或者您可以将整个文件直接读入一个字符串,然后 运行 您的 RegEx
.
下面是一个片段,它获取数据文件中的字节数,然后使用 mgetstr, a function that accepts the number of chars to read and a file descriptor obtained through mopen 将整个文件读入一个字符串,然后 运行s 一个 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);
注意:该模式使用环视((?<=...)
和 (?=...)
)来断言紧接在电阻值之前和之后的是 ,
和 ,Ω
。中间模式 \d+(\.\d+)?
匹配电阻值的整数部分,如果有的话,它的小数部分。
我想您在粘贴 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
表示文件头的行数,递归提取(:,3)
选择第三列
非常感谢! :-)
顺便说一句,如果我从命令中理解正确,则没有注意分隔符(在本例中为逗号,)那么我猜逗号是否设置为默认分隔符?
你好,我是 Scilab 的初学者,我有作业处理测量值,这些值保存在 csv 文件中。这是该文件中值的示例:
"Project Name:,<Empty>"<br />
"Company Name:,<Empty>"<br />
"User Name:,<Empty>"<br />
"Job Title:,<Empty>"<br />
"Location:,<Empty>"<br />
"Remarks:,<Empty>"<br />
"Date_Time,Test ID,Value_A,Unit_A,Function_A,MeterID_A,BluetoothID_A,Remarks_A"<br />
"2021-03-11 16:59:54,TP0,1968.2,Ω,Res,U1252B-MY52430232,U1177A-238EBF,"<br />
"2021-03-11 16:59:55,TP1,1967.6,Ω,Res,U1252B-MY52430232,U1177A-238EBF,"<br />
"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,"
我正在尝试使用这些命令仅获取电阻值:
dates = mgetl('NTC2k2.csv')
[start, final, match] = regexp(dates(1:$,1)),'/[1-9.]*,Ω/')
但我的大问题是,当我尝试使用此代码时,它抛出函数 regexp 无法与矩阵日期 (1:$,1) 一起使用的异常,请问我不知道下一步如何进行。请帮帮我,非常感谢!
您发布的示例 CSV
似乎包含 HTML
个实体,例如 "
表示双引号字符 "
,'
表示单引号字符 '
、<
和 >
,分别表示字符 <
和 >
。如果这是原始数据中的编码问题,那么您应该重新编码文件,因为 CSV
文件中的数据应该用分隔符(通常是逗号或 space 字符)分隔。
现在进入重点,这里的问题是 mgetl()
returns 一个字符串向量,每个字符串代表文件中的一行。
但是,根据 regexp 的 Scilab 文档,第一个参数必须是字符串。因此,您应该将字符串向量连接成一个字符串,或者您可以将整个文件直接读入一个字符串,然后 运行 您的 RegEx
.
下面是一个片段,它获取数据文件中的字节数,然后使用 mgetstr, a function that accepts the number of chars to read and a file descriptor obtained through mopen 将整个文件读入一个字符串,然后 运行s 一个 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);
注意:该模式使用环视((?<=...)
和 (?=...)
)来断言紧接在电阻值之前和之后的是 ,
和 ,Ω
。中间模式 \d+(\.\d+)?
匹配电阻值的整数部分,如果有的话,它的小数部分。
我想您在粘贴 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
表示文件头的行数,递归提取(:,3)
选择第三列
非常感谢! :-) 顺便说一句,如果我从命令中理解正确,则没有注意分隔符(在本例中为逗号,)那么我猜逗号是否设置为默认分隔符?