To get the time value from a large array

I have a text file-
19,TRIP_BKR1,,,0
20,TRIP_BKR2,,,0
21,Trip 3Ph PHS,,,0
60.000000
1
1200.0000,749
16/07/2009,16:09:53.729166
16/07/2009,16:09:53.829775
ASCII
1
I want to fetch the time data in 3rd and 4th last rows of the above code and store it in a variable. I was using the following function to get it done-
trigger_time = strread(char(cfg_info_ar{1,8}(2)));
start_time = strread(char(cfg_info_ar{1,7}(2)));
Where cfg_info_ar is the file which has all the elements of the array
I was getting only 16 as both trigger_time and start_time. Can you help me out with getting the exact value of the time i,e. 16:09:53.829775 or just 53.829775? Thanks.

3 件のコメント

Image Analyst
Image Analyst 2015 年 7 月 19 日
How large is it? How many gigabytes? You might have to use memmapfile() if it's really big.
Jan
Jan 2015 年 7 月 19 日
How can "cfg_info_ar" be "the file", when it is obviously a cell string? How did you obtain this variable? What is it's contents? What is the purpose of the (2)? How do you exclude the lines, which do not contain the lines? What is the exact definition of the pattern for the data?
strread is deprecated for many years now. So better use textread.
Mohit Sharma
Mohit Sharma 2015 年 7 月 19 日
編集済み: per isakson 2015 年 7 月 19 日
Jan,
Yes cfg_info_ar is a cell string. I used the below method to obtain this cell string-
cfg_file = fopen(**file name and path**);
config = textscan(cfg_file, '%s', 'delimiter', '\n');
cfg_info_ar = cell(size(config));
cfg file is a configuration file of COMTRADE standard. So it has the information of all the channels(digital and analog). It also has information of the point in time when the fault is initiated (trigger_time). I just want to get that in a variable. The time data is in the format- 16:09:53.829775 (GPS time). I want to have only 53.829775. (2) denotes the second column as you can see first column has date and the second column has time in 3rd and 4th last rows.

サインインしてコメントする。

回答 (2 件)

Image Analyst
Image Analyst 2015 年 7 月 19 日

0 投票

Have you seen COMTRADE Reader: http://www.mathworks.com/matlabcentral/fileexchange/15619-comtrade-reader? Does it do what you want?

2 件のコメント

Mohit Sharma
Mohit Sharma 2015 年 7 月 19 日
It helps only with reading a COMTRADE file. I have to derive various quantities like harmonic distortion, sequence components after reading the file.
Image Analyst
Image Analyst 2015 年 7 月 20 日
You said that with how you read it, you got only 16 instead of 16:09:53.829775 so I figured it was a reader problem. Once it's read in properly of course you can do anything you want with the numbers but it sounds like you don't have the numbers read in properly yet.

サインインしてコメントする。

per isakson
per isakson 2015 年 7 月 19 日
編集済み: per isakson 2015 年 7 月 20 日

0 投票

  • Why is the word "large" in the title? How large is the file?
  • These two dates are they the only ones in the file?
For a start try:
>> cssm
cac =
'53.729166' '53.829775'
num =
53.729165999999999 53.829774999999998
>>
where cssm.m is
function cssm
str = fileread( 'cssm.txt' );
cac = regexp( str, '(?<=\d{2}/\d{2}/\d{4},\d{2}:\d{2}:)\d{2}\.\d+', 'match' );
num = str2double( cac );
format long
cac
num
end
and cssm.txt consists of the sample you provided in the question
&nbsp
Triggered by the comments:
>> [ t1, t2 ] = cssm( 'c:\m\cssm\cssm.txt' )
t1 =
53.7292
t2 =
53.8298
where
function [ t1, t2 ] = cssm( filespec )
str = fileread( filespec );
cac = regexp( str, '(?<=\s\d{2}/\d{2}/\d{4},\d{2}:\d{2}:)\d{2}\.\d+\s', 'match' );
t1 = str2double( cac(1) );
t2 = str2double( cac(2) );
end

8 件のコメント

Mohit Sharma
Mohit Sharma 2015 年 7 月 19 日
Yes, it has only these two dates in the whole array. By "large", I meant that the array which I have appended is not the complete array. It has a total of 48 rows and each row has different number of columns.
Mohit Sharma
Mohit Sharma 2015 年 7 月 19 日
I have attached the text file. It would be really great if you could tell how to get exactly that 53.829775 (which is written after date in that file) in one variable
Image Analyst
Image Analyst 2015 年 7 月 19 日
48 is far, far from large. Large would be like hundreds of millions or billions. In addition, "large" does not mean "not complete", it means "big".
per isakson
per isakson 2015 年 7 月 19 日
編集済み: per isakson 2015 年 7 月 19 日
Then the first three lines of the function, ccsm, will do the job, i.e. "I want to have only 53.829775". A good thing with this solution is that it doesn't depend on "rows" and "columns". Less good is that it takes some effort to get used to regular expressions. (The Matlab documentation of regular expression is okey - imo.)
Mohit Sharma
Mohit Sharma 2015 年 7 月 20 日
I am facing problem implementing fileread function. Whenever I execute it, it says "no such file or directory" for my file's name. I tried using fullfile function to locate the path of my file, but I still get the same error. Any help will be appreciated. Thanks.
Image Analyst
Image Analyst 2015 年 7 月 20 日
Then it does not exist. Check with this:
fullFileName = fullfile(folder, 'cssm.txt');
if exist(fullFileName, 'file')
uiwait(helpdlg('It exists'));
else
message = sprintf('File %s does not exist', fullFileName);
uiwait(warndlg(message));
end
Mohit Sharma
Mohit Sharma 2015 年 7 月 20 日
Thanks a lot, I now get the result what per isakson was having. It would be great if I can have the 2 values which we get in "num" in two different variables. Kindly help.
Mohit Sharma
Mohit Sharma 2015 年 7 月 20 日
I got that. Thanks a lot for helping me out. I owe you people a treat :)

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeText Data Preparation についてさらに検索

タグ

質問済み:

2015 年 7 月 19 日

編集済み:

2015 年 7 月 20 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by