我有一个复数的csv文件。
这是csv文件中一些数字的示例:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>build-first</id>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<archive>
<manifest>
<mainClass>com.joy.hmi.core.HMIApplication</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>HMIApp</finalName>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.joy.hmi.core.HMIApplication</mainClass>
</manifest>
<manifestEntries>
<Class-Path>images/ config/ properties/ controlTidxConfig/ HMITidxConfig/</Class-Path>
<Trusted-Library>true</Trusted-Library>
<Permissions>all-permissions</Permissions>
<Codebase>*</Codebase>
<Trusted-Only>true</Trusted-Only>
</manifestEntries>
</archive>
</configuration>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
<execution>
<id>make-the-zip</id>
<goals>
<goal>single</goal>
</goals>
<phase>package</phase>
<configuration>
<finalName>HMIApp</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
我想读取此文件,然后将第一列中的所有实部和第二列中的所有虚部(没有虚字母j)保存在(.out)文件中。
答案 0 :(得分:0)
这是一次尝试。由于(
和)
包围着您的数字,因此稍微复杂一些。
首先,使用textscan读取文件。由于我猜您不知道文件中有多少个数字,因此请将所有内容读取为单数字符串。也适用于多行:
filename = 'data.csv';
fid = fopen(filename);
content = textscan(fid, '%s');
fclose(fid);
为此,content
现在是一个有点奇怪的cell
数组(有关详细信息,请查看textscan
-docs)。只需初始化变量nums
,它将存储数字并遍历content
(如果您对csv文件有更多了解,则可以预分配nums
):
nums = [];
for c1 = 1:numel(content{1})
接下来,在每次出现,
时拆分字符串:
string_list = strsplit(content{1}{c1},',');
这将提供另一个单元格数组。循环遍历以将字符串转换为数字(并结束外部循环):
for c2 = 1 : numel(string_list)
nums(end+1) = str2num(string_list{c2});
end
end
最后,只需将数字的实部和虚部存储在单独的列中:
out = [];
out(:,1) = real(nums);
out(:,2) = imag(nums);
并将其保存到data.out
。
更新正如您提到的精度,您可以使用
dlmwrite('data.out', out, 'precision','%.20f');
但是,在这里您需要了解Matlab中的floating point representation。特别是,请尝试了解以下内容:
>> a = 0.12825663763789857
a =
0.1283
>> fprintf('%.20f\n', a)
0.12825663763789857397
>> eps(a)
ans =
2.7756e-17
请注意,无需将字符串转换为数字即可完成此操作,但是上述方法将允许您在Matlab中使用数据,而不仅仅是保存数据。
答案 1 :(得分:0)
这是不将字符串转换为数字的尝试,因此不必处理精度。它也适用于负实数和虚数。写入新文件时,+
个符号被删除,-
个符号被保留:
filename = 'data.csv';
fid = fopen(filename);
content = textscan(fid, '%s');
fclose(fid);
fid = fopen('data.out','w');
pattern = '(?<real>-{0,1}\d+.\d+)(?<imag>[+-]\d+.\d+)j';
for c1 = 1:numel(content{1})
result = regexp(content{1}{c1}, pattern, 'names');
for c2 = 1:numel(result)
fprintf(fid, '%s,%s\n', strrep(result(c2).real,'+',''), strrep(result(c2).imag,'+',''));
end
end
fclose(fid);