1

I have imported some stock market data from a website but I am having problems in separating them. In a part of the code it's working fine, but just at the end it is not. Here is the code:

NSURL *url = [NSURL URLWithString:@"http://www.bloomberg.com/quote/USIM5:BZ"];

NSData *webData = [NSData dataWithContentsOfURL:url];

//NSString *xPathQuery = @"//h3[@class=''] |//span[@class=' price'] | //span[@class=' trending_up up'] | //span[@class=' trending_up up']/span | //table[@class='snapshot_table']/tr/th | //table[@class='snapshot_table']/tr/td";

NSString *xPathQuery = @"//span[@class=' price'] | //span[@class=' trending_up up'] | //span[@class=' trending_up up']/span | //table[@class='snapshot_table']/tr/td";

TFHpple *parser = [TFHpple hppleWithData:webData isXML:NO];

NSArray *array = [parser searchWithXPathQuery:xPathQuery];

valores = [[NSMutableArray alloc]init];
for (TFHppleElement *element in array) {
    [valores addObject:[[element firstChild] content]];
}

novosValores = [[NSMutableArray alloc]init];
for (NSString *valuesDatum in valores) {
    NSString *removeNewLine = [[valuesDatum componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] componentsJoinedByString:@" "];
    NSString *removeSpace = [removeNewLine stringByReplacingOccurrencesOfString:@"         " withString:@""];
    NSString *removeSpaceOne = [removeSpace stringByReplacingOccurrencesOfString:@"    " withString:@""];
    [novosValores addObject:removeSpaceOne];
}

NSLog(@"%@",novosValores);

valoresFinais = [[NSMutableArray alloc]init];
for (NSString *valuesDatum in novosValores) {
    NSArray *val = [valuesDatum componentsSeparatedByString:@" - "];
    [valoresFinais addObject:val];
}

NSLog(@"%@",valoresFinais);

infos = [[NSMutableArray alloc]init];
for (NSString *dados in valoresFinais) {
    NSArray *arrayDados = [dados componentsSeparatedByString:@","];
    [infos addObject:arrayDados];
}
NSLog(@"%@", infos);
}

The logs show me this:

2013-01-19 12:45:17.526 BloombergQuotes[1720:c07] (
"12.300",
"12.580",
"12.270 - 12.590",
"4,572,600",
"12.460",
"5.570 - 13.770",
"+7.82%"
)
2013-01-19 12:45:17.528 BloombergQuotes[1720:c07] (
    (
    "12.300"
),
    (
    "12.580"
),
    (
    "12.270",
    "12.590"
),
    (
    "4,572,600"
),
    (
    "12.460"
),
    (
    "5.570",
    "13.770"
),
    (
    "+7.82%"
)
)
2013-01-19 12:45:17.528 BloombergQuotes[1720:c07] -[__NSArrayI    componentsSeparatedByString:]: unrecognized selector sent to instance 0x7434eb0
2013-01-19 12:45:17.529 BloombergQuotes[1720:c07] *** Terminating app due to uncaught  exception 'NSInvalidArgumentException', reason: '-[__NSArrayI componentsSeparatedByString:]:  unrecognized selector sent to instance 0x7434eb0'
*** First throw call stack:
(0x2101012 0x11fae7e 0x218c4bd 0x20f0bbc 0x20f094e 0x2fbe 0x223817 0x223882 0x172a25   0x172dbf 0x172f55 0x17bf67 0x13ffcc 0x140fab 0x152315 0x15324b 0x144cf8 0x205cdf9 0x205cad0   0x2076bf5 0x2076962 0x20a7bb6 0x20a6f44 0x20a6e1b 0x1407da 0x14265c 0x215d 0x2085)
libc++abi.dylib: terminate called throwing an exception
(lldb) 

So the first chunk of data is almost fine for what I need, except the 3rd and 5th line that I need to separate by the " - ". I did that and the result is the second chunk of data, but it returned me values connected by "," on the 3rd and 5th line. So I did again separated by "," and that's where the error comes.

So, what I need is the contents of the first chunk of data all separated.

Any help would be appreciated..

Thanks!!!

Shai
  • 111,146
  • 38
  • 238
  • 371
Marco Almeida
  • 1,285
  • 3
  • 17
  • 39

1 Answers1

3

One handy tip is to set a breakpoint that will catch any exception where it occurs. In XCode, open the Breakpoints 'tap', click the plus sign at the bottom of the window and choose "Add Exception Breakpoint...". Keep default options and hit "Done".

Next, the exception is telling you what it doesn't like:

reason: '-[__NSArrayI componentsSeparatedByString:]: unrecognized selector sent to instance 0x7434eb0'

You are sending componentsSeparatedByString to an NSArray. (Sure, you tried to call it an NSString, but it's not. I'm curious if running "Analyze" on the code would catch this issue, I bet it might.)

The componentsSeparatedByString method returns an array, which you are stuffing into another array valoresFinais. However, you pull the items out of that array and call them an NSString. Oops! Pull them out as an array, and iter that array of strings, and I suspect your code will start working.

This was just a quick read of your example, but I think that's the issue. Best of luck.

Dave
  • 7,552
  • 4
  • 22
  • 26
  • What I don't unsderstand is that the code I wrote to separate the array by "- " worked fine and I just copied the code to work with separating ","but it didn't. So I don't understand why it did not. As to your explanation I appreciate it very much, but it is a bit confusing to me. Could you please explain it in a more clear way? Thank you Dave. – Marco Almeida Jan 19 '13 at 16:22
  • valors is an array of NSStrings. However, valoresFinais is an array of NSArray (which is an array of NSString). Your 1st time, you are correct. But when you itor valoresFinais, you must use for (NSArray *componentsArray in valoresFinais) and within that for (NSString*dados in componentsArray). Pretty sure on that, but didn't run your code. – Dave Jan 19 '13 at 16:36
  • Ooops I finally understand your answer Dave and it solved the problem!!!! Thank you very much!!!! – Marco Almeida Jan 19 '13 at 16:37