将.csv转换为.out(复数)

时间:2019-10-23 18:05:19

标签: matlab csv file-upload complex-numbers

我有一个复数的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)文件中。

2 个答案:

答案 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);