2013-03-08 60 views
0

我使用的是API来获取列车的实际数据时间,并试图获取距离用户输入时间最近的列车时间,然后显示该列车时间,并且接下来的4个列车准许列车运行。我正在阅读信息,代码完成了它应该做的事情,但是当我在7个单元格中查看数组中的一堆[]括号而不是计算出的数字时。有什么建议么?下面的代码与API将Int附加到数组Matlab中

测试值: requestStationSelected = '大学%20City' 和requestEndStation = '罗斯林'

%this is the API link for the live data from Septa this will get 30 
%results and see which time is closer to the user entered time 
requestInfoSeptaLive = ['http://www3.septa.org/hackathon/NextToArrive/' requestStationSelected '/' requestEndStation '/30']; 

%Again tries to get the information and if there is a failure it will give 
%a probable cause and terminate the program 
try 
    getInfoSeptaLive = urlread(requestInfoSeptaLive); 
catch 
    if getInfoSeptaLive ~= '[]' 
     disp... 
      ('Either the arrival/depart stations dont quite match up or theres a server error. Try again.'); 
     return; 
    else 
     disp('Unable to fetch the information from Septa, please try again') 
     return; 
    end 
end 
%parses the information returned from the Live API 
dataReturnedFromLiveAPI = parse_json(getInfoSeptaLive); 
dataReturnedFromLiveAPI = dataReturnedFromLiveAPI{1}; 

%gets the size of the API in case there are no trains running 
sizeOfDataNoTrains = size(dataReturnedFromLiveAPI, 1); 
sizeOfData = size(dataReturnedFromLiveAPI, 2); 

counter = 0; 

for i = 1:sizeOfData 
    scanForClosestTime = dataReturnedFromLiveAPI{1,i}.orig_departure_time; 

    trainTimeGivenH = sscanf(scanForClosestTime, '%i'); 
    findColonTrain = strfind(scanForClosestTime, ':'); 
    trainTimeGivenMStr = scanForClosestTime(findColonTrain+1:4); 
    trainTimeGivenM = int32(str2num(trainTimeGivenMStr)); 
    trainDepartTimeM = (trainTimeGivenH(1,1) * 60) + (trainTimeGivenM); 

    differenceBetweenTimes = trainDepartTimeM - userEnteredMins; 
    if trainDepartTimeM < userEnteredMins 
     differenceBetweenTimes = userEnteredMins - trainDepartTimeM; 
    end 

    stopAtEndOfData = sizeOfData; 
    goodTimeFrame = 60; 
    closestTime = cell(1, stopAtEndOfData); 
    storeTheDifference = cell(1, stopAtEndOfData); 

    if(differenceBetweenTimes < 60) 
     if (counter < 5) 
      closestTime{i} = scanForClosestTime; 
      storeTheDifference{i} = differenceBetweenTimes; 
      counter = counter + 1; 
     end 
    end 
end 
+0

您可以给'requestStationSelected'和'requestEndStation'有效的值,这样我们就可以看到问题是什么样子了?一个'[]'意味着一个空单元 - 通常,如果你先分配给{3}而没有先用{1}和{2}做某件事,你会得到{[],[],value}。它看起来像是在你分配'nearestTime {i}'的地方发生的,但是不能运行我猜测的代码。 – Floris 2013-03-09 00:54:14

+0

requestStationSelected ='University%20City'and requestEndStation ='Roslyn' – heinst 2013-03-09 00:59:09

回答

1

您分配for循环内的电池阵列:

for i = 1:sizeOfData 
    ... 
     closestTime = cell(1, stopAtEndOfData); 
     storeTheDifference = cell(1, stopAtEndOfData); 
    ... 
end 

这意味着你在循环的每一次迭代中都将它们变成了一个{[],[],[],[],[]...}的数组 - 所以除非最后一次迭代中有一个有效的“最接近的时间”,否则你的单元格数组将全部为空数组 - 如果它确实,除最后一个元素外,其余都是[]。

若要解决此问题,请将两行移至之前开始的for循环。

第二个问题似乎是存储结果的数组的索引。如果你只需要五个结果,我假设你想将它们存储在数组的元素1 - 5中,而不是“只是任何”位置。我会更改代码到

if (counter < 5) 
     counter = counter + 1; 
     closestTime{counter} = scanForClosestTime; 
     storeTheDifference{counter} = differenceBetweenTimes; 
    end 

但也许我误解了你想如何处理?

无关你的问题,你可能想看看行

trainTimeGivenMStr = scanForClosestTime(findColonTrain+1:4); 

这是很可能的,这是不是你打算做 - 看响应的例子,我发现字符串"orig_departure_time":"11:57PM"。我希望findColonTrain == 3,使上面的线变得

trainTimeGivenMStr = scanForClosestTime(4:4); 
  • 只是一个单一的字符。 trainTimeGivenMStr = scanForClosestTime(findColonTrain +(1:4));或者你的意思是

    trainTimeGivenMStr = scanForClosestTime

这将变成

trainTimeGivenMStr = scanForClosestTime(4:7); 

使

trainTimeGivenMStr = '57PM'; 

我希望这三件事情帮助你得到它的所有工作!

编辑:有一个机会今天早上运行你的代码 - 发现了一些其他问题。我在下面包含一个带注释的“工作”代码:最大的问题很可能是您没有在代码中处理AM/PM。请注意,我使用了不同的json解析器 - 这稍微改变了几行。我相信你可以把它放在一起按照你想要的方式工作。这会在所有单元格中返回有效数据。

dataReturnedFromLiveAPI = loadjson(getInfoSeptaLive); 
% next line not needed - loadjson returns struct array, not cell array 
%dataReturnedFromLiveAPI = dataReturnedFromLiveAPI{1}; 

%gets the size of the API in case there are no trains running 
sizeOfDataNoTrains = size(dataReturnedFromLiveAPI, 1); 
sizeOfData = size(dataReturnedFromLiveAPI, 2); 

counter = 0; 
stopAtEndOfData = sizeOfData; 
closestTime = cell(1, stopAtEndOfData); 
storeTheDifference = cell(1, stopAtEndOfData); 
userEnteredMins = 12*60+30; % looking for a train around 12:30 pm 

for ii = 1:sizeOfData 
    scanForClosestTime = dataReturnedFromLiveAPI(ii).orig_departure_time; 

    trainTimeGivenH = sscanf(scanForClosestTime, '%i'); 
    % since we'll be considering AM/PM, have to set 12 = 0: 
    if (trainTimeGivenH == 12), trainTimeGivenH = 0; end 
    findColonTrain = strfind(scanForClosestTime, ':'); 
    % change next line to get minutes plus AM/PM: 
    trainTimeGivenMStr = scanForClosestTime(findColonTrain+(1:4)); 
    % look at just minutes: 
    trainTimeGivenM = int32(str2num(trainTimeGivenMStr(1:2))); 
    % adjust for AM/PM: 
    if(trainTimeGivenMStr(3:4)=='PM'), trainTimeGivenH = trainTimeGivenH+12; end; 
    % compute time in minutes: 
    trainDepartTimeM = (trainTimeGivenH * 60) + (trainTimeGivenM); 

    differenceBetweenTimes = trainDepartTimeM - userEnteredMins; 
    if trainDepartTimeM < userEnteredMins 
     differenceBetweenTimes = userEnteredMins - trainDepartTimeM; 
    end 
    % added a couple of lines to see what is happening: 
    fprintf(1, 'train %d: depart %s - in minutes this is %d vs user entered %d\n', ... 
     ii, scanForClosestTime, trainDepartTimeM, userEnteredMins); 

    goodTimeFrame = 60; 

    if(differenceBetweenTimes < 600) 
     if (counter < 10) 
      counter = counter + 1; 
      closestTime{counter} = scanForClosestTime; 
      storeTheDifference{counter} = differenceBetweenTimes; 
     end 
    end 
end 
+0

这样做效果更好,但只有前两个最近的时间出现,其余3个只是[]括号...任何想法为什么? – heinst 2013-03-09 20:38:22

+0

对于其他人来说,差异之间的差异是否大于60? – Floris 2013-03-09 22:39:08

+0

你最大的问题是没有处理AM/PM。我用一个有效的代码示例更新了我的答案。 – Floris 2013-03-11 14:00:32