我正在将一些Matlab代码转移到Python.我对Python比较陌生,并且不确定Python等效于Matlab的textscan
方法.任何帮助将不胜感激.
我正在使用表格读取数据textscan()
.该表有90列,我想将每列的值作为浮点数读取.看看文档,我必须使用说明符%f
- 但似乎我需要使用它90次,所以我最终得到这个:
c = textscan(fid,'%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f
%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f
%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f
%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f');
Run Code Online (Sandbox Code Playgroud)
这基本上有用,但我想知道是否有一些方法可以避免为我的表中的每一列输入说明符.
我正在使用textscan从文件中读取数据.正在读取的数据是:
"ABC",0.156
"DEF",0.125
"GHI",0.101
Run Code Online (Sandbox Code Playgroud)
我的代码是 - data = textscan(fid, '%s %f', 'Delimiter', ',');
数据{1}来了
'"ABC"'
'"DEF"'
'"GHI"'
Run Code Online (Sandbox Code Playgroud)
我希望数据{1}为 -
'ABC'
'DEF'
'GHI'
Run Code Online (Sandbox Code Playgroud)
最后,我怎么能得到答案
data =
'ABC' [0.156];
'DEF' [0.125];
'GHI' [0.101];
Run Code Online (Sandbox Code Playgroud)
而不是使用数据{1}和数据{2}.谢谢!
我在Linux Mint v12上运行Matlab R2011b和R版本2.13.1,内存为16 GB.
我有一个csv文件.前5行(和标题)是:
#RIC,Date[G],Time[G],GMT Offset,Type,Price,Volume
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.68,1008
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.68,1008
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.66,300
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.65,1000
DAEG.OQ,07-JUL-2011,15:10:03.464,-4,Trade,1.65,3180
Run Code Online (Sandbox Code Playgroud)
文件很大(约900MB).鉴于字符和数字数据的组合,可以将此文件读入matlab,如下所示:
fid1 = fopen('/home/MyUserName/Temp/X.csv');
D = textscan(fid1, '%s%s%s%f%s%f%f', 'Delimiter', ',', 'HeaderLines', 1);
fclose(fid1);
Run Code Online (Sandbox Code Playgroud)
虽然文件是900MB,但在运行上面的代码时,系统监视器表明我的RAM使用率从大约2GB跳到10GB.更糟糕的是,如果我尝试使用稍微大一点的csv文件(大约1.2 GB)进行相同的操作,我的RAM最大值为16GB,而Matlab从未设法读完数据(它只是停留在"忙碌"模式).
如果我想将相同的文件读入R,我可能会使用:
D <- read.csv("/home/MyUserName/Temp/X.csv", stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)
这比Matlab要长一些,但系统监视器表明我的RAM使用率仅从2GB跳到3.3GB(考虑到原始文件大小,更合理).
我的问题有两个部分:
1)为什么textscan
在这种情况下会出现这样的记忆?
2)我是否可以使用另一种方法在我的系统上将这种类型的1.2GB csv文件放入Matlab而不会超出RAM?
编辑:只是为了澄清,我很好奇是否存在一个仅限matlab的解决方案,即我对使用不同语言将csv文件分解为更小块的解决方案不感兴趣(因为这是什么我已经在做了).对不起Trav1s,我应该从一开始就明白这一点.
我有一个数据值和时间戳的文件,我试图在Matlab中拆分.这是格式:
-18.151346 Mon Jan 28 11:33:08 2013
Run Code Online (Sandbox Code Playgroud)
我正在使用textscan功能来尝试拆分它.
data=textscan(fid,'%f%s%s%f%s%n','delimiter','space');
Run Code Online (Sandbox Code Playgroud)
我正在尝试将时间戳拆分为单独的列,以便我可以使用时间而不是日期或年份.我看了一些以前非常相似的问题,但由于某种原因,我无法让它做我想做的事.我得到的单元格数组采用这种格式.
Column 1 Column 2 Column 3
-18.151346 Mon Jan 28 11:33:08 2013
Run Code Online (Sandbox Code Playgroud)
我是Matlab的新手,所以任何帮助都将不胜感激.提前致谢.
我正在尝试使用textscan
MATLAB 分析一个非常大的文件.有问题的文件大小约为12 GB,包含大约2.5亿行,每行有7个(浮动)数字(由空格分隔); 因为这显然不适合我桌面的RAM,我正在使用MATLAB文档中建议的方法(即一次加载和分析文件的一个较小的块.根据文档,这应该允许处理"任意大分隔文本文件[s]").这只允许我扫描大约43%的文件,之后文本扫描开始返回空单元格(尽管仍有数据留在文件中扫描).
为了调试,我尝试使用该fseek
函数转到文件中的多个位置,例如:
fileInfo = dir(fileName);
fid = fileopen(fileName);
fseek(fid, floor(fileInfo.bytes/10), 'bof');
textscan(fid,'%f %f %f %f %f %f %f','Delimiter',' ');
Run Code Online (Sandbox Code Playgroud)
我假设我在fseek
这里使用的方式将位置指示器移动到我文件的大约10%.(我知道这并不一定意味着该指标是在一行的开头,但如果我跑textscan
两次,我得到一个满意的答案.)现在,如果我取代fileInfo.bytes/10
的fileInfo.bytes/2
(即它移动到文件的大约50%一切都崩溃了,textscan
只返回一个空的1x7单元格.
我使用文本编辑器查看了大文件的文件,这表明整个文件看起来很好,并且没有理由textscan
混淆.我能想到的唯一可能的解释是,在我不太了解的更深层次上出现问题.任何建议将不胜感激!
编辑
我的代码的相关部分过去看起来像这样:
while ~feof(fid)
data = textscan(fid, FormatString, nLines, 'Delimiter', ' '); %// Read nLines
%// do some stuff
end
Run Code Online (Sandbox Code Playgroud)
首先,我尝试使用ftell
并fseek
按照Hoki的建议进行修复.这给出了与之前完全相同的错误:MATLAB无法读取超过大约43%的文件.然后我尝试使用HeaderLines
解决方案(也在下面建议),如下所示:
i = 0;
while ~feof(fid)
frewind(fid)
data = textscan(fid, FormatString, nLines, …
Run Code Online (Sandbox Code Playgroud) 我试图将大的txt文件(> 1gb)导入matlab.
这是数据结构:
667.55535 -0.00 0.000 0.0158
667.5554 -0.01 -0.000 0.0158
667.55545 -0.01 4.037 10.0000
667.5555 -0.00 4.000 10.0000 #1 Trigger Camera 10 Hz #2 Trigger Camera 10 Hz
667.55555 -0.00 4.000 10.0000
667.5556 -0.01 4.000 10.0000
Run Code Online (Sandbox Code Playgroud)
我使用textscan功能:
segarray = textscan(file_id, '%f %f %f %f', blocksize, 'delimiter','\n', 'commentStyle', '#');
Run Code Online (Sandbox Code Playgroud)
工作得很好,但如果我将格式字符串更改为'%f%f%f%f%s'并删除'commentStyle','#'选项,我需要标记为'#'的注释单个字符串:/
有任何想法吗?
我有一个大的csv文件(应该是大约100万行),其中包含具有以下结构的选项数据(内容被更改):
secid, date, days, delta, impl_volatility, impl_strike, impl_premium, dispersion, cp_flag, ticker, index_flag, industry_group
100000, 02/05/1986, 60, -80, 0.270556, 74.2511, 5.2415, 0.021514, C, ASC, 0, 481
100000, 03/05/1986, 30, -40, 0.251556, 74.2571, 6.2415, 0.025524, P, ASC, 0, 481
Run Code Online (Sandbox Code Playgroud)
我使用以下方法成功导入了测试文件:
ftest = fopen('test.csv');
C = textscan(ftest,'%f %s %f %f %f %f %f %f %s %s %f %f','Headerlines',1,'Delimiter',',');
fclose(ftest);
Run Code Online (Sandbox Code Playgroud)
但是,C是一个单元格数组,这使得在matlab中处理文件内容变得更加困难.将它作为"常规"数组更容易(原谅我不知道正确的命名法,我刚开始使用matlab).
如果我输出C,我得到:
Columns 1 through 6
[2x1 double] {2x1 cell} [2x1 double] [2x1 double] [2x1 double] [2x1 double]
Columns 7 through 12
[2x1 double] …
Run Code Online (Sandbox Code Playgroud) 我的问题是,我有以下格式的CSV数据:
1,000333e+003;6,620171e+001
1,001297e+003;6,519699e+001
1,002261e+003;6,444984e+001
Run Code Online (Sandbox Code Playgroud)
我想将数据读入matlab,但csvread
要求它以逗号分隔,并且我无法找到逗号小数标记的解决方案.我想我可以用textscan
某种方式?
我很遗憾地问这个(我认为)这个简单的问题,但我希望有人可以提供帮助.这里的其他问题/答案似乎都没有处理逗号和分号的这种组合.
我有一个包含20列的CSV文件。一些列具有数字值,其他列具有文本值,而文本列可能包含或可能不包含逗号。
CSV内容示例:
column1, column2, column3, column4
"text value 1", 123, "text, with a comma", 25
"another, comma", 456, "other text", 78
Run Code Online (Sandbox Code Playgroud)
我正在使用textscan
函数,但是却遇到了最多的错误和奇怪的行为。使用一些参数,它只读取一列中的所有值,某些情况下,它会重复列,并且我尝试过的大多数操作都导致逗号被错误地解释为列分隔符(尽管文本用双引号引起来)。也就是说,我尝试指定'delimiter'参数,并且还包括格式规范中的文字,无济于事。
textscan
如上例所示,调用处理CSV文件的正确方法是什么?我正在寻找一种既可以在MATLAB上又可以在Octave上运行的解决方案(或者,如果不可能的话,可以在每个解决方案中都使用等效的解决方案)。