Sql 在Matlab中,将NaN替换为很长字符串的Null

Sql 在Matlab中,将NaN替换为很长字符串的Null,sql,matlab,Sql,Matlab,我有一个很长的字符串,我想找到所有的NaN值并将其替换为“Null”。此长字符串是从120 x 150000单元格转换而来的。将其转换为长字符串的原因是,我打算将其转换为一个巨大的SQL查询,因为fastinsert和datainsert可能非常慢,有时我会耗尽堆空间。我们的想法是做以下工作 exec(sqlConnection, long_string) 我尝试使用regexpreop将NaN替换为null,但速度似乎很慢。还有别的办法吗 long_string = regexprep(l

我有一个很长的字符串,我想找到所有的NaN值并将其替换为“Null”。此长字符串是从120 x 150000单元格转换而来的。将其转换为长字符串的原因是,我打算将其转换为一个巨大的SQL查询,因为fastinsert和datainsert可能非常慢,有时我会耗尽堆空间。我们的想法是做以下工作

exec(sqlConnection, long_string) 
我尝试使用regexpreop将NaN替换为null,但速度似乎很慢。还有别的办法吗

long_string = regexprep(long_string,'NaN','null');
regex功能非常强大,但由于其灵活性,速度可能较慢。如果您仍然拥有原始单元格数组,并且假设它只包含字符串,那么下面的代码行应该可以工作,而且速度非常快:

cellArray{find(ismember(cellArray,'NaN'))} = 'null';
ismember查找cellArray中所有为NaN的元素,返回与cellArray形状相同的布尔数组;find操作将这些元素转换为NaN元素的索引,然后您只需将值null分配给所有元素

必须指出的是,120 x 150000是一个非常大的单元阵列-即使每个单元中只有一个字符,它也会占用超过2GB的空间。我知道这一点,因为我刚刚创建了一个120x15000单元阵列,它是20550000字节。这可能是值得的处理,在较小的块,而不是所有的一次。特别是如果您知道NaN只会出现在某些列中,例如

处理GB大小的字符串,特别是当您不能在适当的位置操作时,每次更换都会更改字符串的大小,而且字符串会变长,而不是变短,这将非常缓慢。如果您真的没有其他选择,那么您可以编写一个简短的mex函数来完成此操作,这可能非常快。

正则表达式功能非常强大,但由于其灵活性,速度可能会很慢。如果您仍然拥有原始单元格数组,并且假设它只包含字符串,那么下面的代码行应该可以工作,而且速度非常快:

cellArray{find(ismember(cellArray,'NaN'))} = 'null';
ismember查找cellArray中所有为NaN的元素,返回与cellArray形状相同的布尔数组;find操作将这些元素转换为NaN元素的索引,然后您只需将值null分配给所有元素

必须指出的是,120 x 150000是一个非常大的单元阵列-即使每个单元中只有一个字符,它也会占用超过2GB的空间。我知道这一点,因为我刚刚创建了一个120x15000单元阵列,它是20550000字节。这可能是值得的处理,在较小的块,而不是所有的一次。特别是如果您知道NaN只会出现在某些列中,例如

处理GB大小的字符串,特别是当您不能在适当的位置操作时,每次更换都会更改字符串的大小,而且字符串会变长,而不是变短,这将非常缓慢。如果您真的没有其他选择,您可以编写一个简短的mex函数来执行此操作,这可能非常快。

正如Floris提到的,regexp是一个非常强大的命令,因此比其他find命令要慢

除了Floris的建议之外,您还可以尝试使用strrep,这在您的情况下是有效的,因为您没有使用regexp的任何特殊功能

以下是一个例子:

str = char('A' + rand(1,120 * 15000)*('z'-'A'));

tic
str2 = strrep(str, 'g', 'null');
disp('strrep: '), toc

tic
str3 = regexprep(str, 'g','null');
disp('regexprep: '), toc
在我的计算机上,它将返回:

strrep: 
Elapsed time is 0.004640 seconds.
regexprep: 
Elapsed time is 4.004671 seconds.
正如Floris提到的,regexp是一个非常强大的命令,因此比其他find命令要慢

除了Floris的建议之外,您还可以尝试使用strrep,这在您的情况下是有效的,因为您没有使用regexp的任何特殊功能

以下是一个例子:

str = char('A' + rand(1,120 * 15000)*('z'-'A'));

tic
str2 = strrep(str, 'g', 'null');
disp('strrep: '), toc

tic
str3 = regexprep(str, 'g','null');
disp('regexprep: '), toc
在我的计算机上,它将返回:

strrep: 
Elapsed time is 0.004640 seconds.
regexprep: 
Elapsed time is 4.004671 seconds.

字符串中是否有分隔符-您确定NaN始终是您要替换的吗?字符串中是否有分隔符-您确定NaN始终是您要替换的吗?实际上它既有字符串也有数字。我想我会把单元格分割成更小的块,然后处理它。实际上它既有字符串也有数字。我想我会将单元格分割成更小的块,然后进行处理。+1表示三件事:strrep的建议、计时示例和生成随机字符串的绝妙方法!!时间随着字符串的长度变化很大,似乎。。。多亏了你们两个,时间越长,速度越快。非常有用的东西。@Floris:谢谢@user1796228:您还可以考虑在分割数据时使用并行计算,例如parfor。+1表示三件事:strrep的建议、计时示例和生成随机字符串的绝妙方法!!时间随着字符串的长度变化很大,似乎。。。多亏了你们两个,时间越长,速度越快。非常有用的东西。@Floris:谢谢@user1796228:在分割数据时,您还可以考虑使用并行计算,例如parfor。