在Matlab中将NaN替换为非常长的字符串的Null

时间:2013-12-20 16:11:31

标签: sql matlab

我有一个非常长的字符串,我想找到所有的NaN值并将其替换为'Null'。这个长字符串是从120 x 150000单元格转换而来的。将它转换为长字符串的原因是我要将它转换为一个巨大的SQL查询,因为fastinsert和datainsert可能非常慢,有时候我的堆空间已经用完了。想法是做以下

exec(sqlConnection, long_string) 

我尝试使用regexpreop将NaN替换为null,但似乎非常慢。有替代方法吗?

long_string = regexprep(long_string,'NaN','null');

2 个答案:

答案 0 :(得分:5)

正如Floris所说,regexp是一个非常强大的命令,因此比其他查找命令慢。

除了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.

答案 1 :(得分:2)

regex非常强大,但由于其灵活性,可能会很慢。如果你仍然有原始的单元格数组 - 假设它只包含字符串 - 下面的代码行应该可以工作,并且非常快:

cellArray{find(ismember(cellArray,'NaN'))} = 'null';

ismember找到cellArrayNaN的所有元素,返回一个与cellArray形状相同的布尔数组; find操作会将这些操作转换为NaN元素的索引,然后您只需将值null分配给所有元素。

必须说120 x 150,000是一个非常大的单元阵列 - 即使每个单元中只有一个字符,它也会占用2 GB以上(我知道这是因为我刚创建了一个120x15000的单元阵列,它是205,500,000字节)。可能值得在较小的块中处理它,而不是一次性处理。特别是如果您知道NaN仅在某些列中出现,例如。

处理一个GB大小的字符串,特别是当你不能就地操作时(你在每次更换时改变字符串的大小,而且它变得更长,而不是更短)将会变慢。如果你真的没有其他选择,你可以编写一个简短的mex函数来实现这一点 - 这可能非常快。