2012-10-19 41 views
0

我有一個由巴西政府機構提供的小型excel文件,它包含巴西每個城市的記錄,每個城市的郵政編碼範圍和它的「城市代碼」。我可以如何處理這可可?從plist文件檢索條目?

我需要檢索給定城市的「城市代碼」。

我想最好的辦法是解析城市給定的郵政編碼,並根據顯示郵政編碼範圍的前兩列返回其「城市代碼」。

我相信,使用AppleScript我可以爲給定的Excel文件編譯一個plist文件。但是,有人可以指點我幾行objectiveC代碼來解析ZIP代碼從plist文件中檢索給定條目嗎?

請參閱在http://www.idanfe.com/dl/codes.xls.zip

由於Excel文件。

我已上傳樣本plist文件到http://www.idanfe.com/dl/cityCodes.plist

進一步解釋:

我將解析像一個郵政編碼值:01123010這是在01001000和05895490的範圍內,所以我的程序應該返回我城市代碼= 3550308,城市名稱=聖保羅。

我不知道如何實現這一點,我可能已經構建了示例plist錯誤。

我相信我可以使用AppleScript構建plist文件,從Excel工作表讀取。

但是檢索給定郵政編碼範圍的城市代碼是一個難題。

+++編輯:+++

我想我已經解決了它,但它看起來有點笨拙,我寫的幾乎一切。

這AppleScript的讀取Excel工作表,並寫入plist文件:http://www.idanfe.com/dl/creating.scpt.zip

這裏您可以找到1 MB plist文件:http://www.idanfe.com/dl/cityCodes.plist.zip

這是我寫的,以獲得城市代碼我需要的代碼:

NSString *zipCodeString; 
zipCodeString = @"99990000"; 

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"cityCodes" ofType:@"plist"]; 
NSDictionary *cityCodes_dictionary = [NSDictionary dictionaryWithContentsOfFile:plistPath]; 
NSArray *allKeys = [cityCodes_dictionary allKeys]; 

int i = 0; 
for (i = 0 ; i <= [allKeys count]; i++) { 
    NSString *someKey = [allKeys objectAtIndex:i]; 
    NSRange range08 = NSMakeRange (0, 8); 
    NSRange range88 = NSMakeRange (8, 8); 
    NSString *startZipCode = [someKey substringWithRange:range08]; 
    NSString *finalZipCode = [someKey substringWithRange:range88]; 
    int startZipCodeInt = [startZipCode intValue]; 
    int finalZipCodeInt = [finalZipCode intValue]; 

    if(startZipCodeInt <= [zipCodeString intValue] && finalZipCodeInt >= [zipCodeString intValue]){ 
     NSLog(@"we found a winner"); 
     NSString *cityCode = [NSString stringWithFormat: @"%@",[[cityCodes_dictionary objectForKey:someKey]objectForKey:@"City Code"]]; 

     [cityCodeIBGEField setStringValue:cityCode]; 
     NSLog(@"cityCode = %@",cityCode); 
     break; 
    } else { 
     // NSLog(@"no winners"); 
    } 
} 

基本上我把起始zipCode和finalZip代碼附加到一個16位數的字符串中,所以我在plist文件中創建了一條記錄。

然後,當搜索城市代碼時,我打破2(回到普通zipCode)的長鍵(2個郵政編碼)並搜索以查看哪個記錄適合給定的zipCode,我需要cityCode。

有些如何看起來不是最適合我的,但出於我自己的意料,代碼是非常快的,儘管在循環中。

我會感激評論...

感謝,

回答

0

讀的plist不應該在所有如果它的結構爲字典的問題:

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile: @"cities.plist"]; 
//NSString *zipStr = [dict valueForKey: @"CityNme"]; //this was an example 

這是比較容易的部分。更難的部分是從xls文件解析和構造plist文件。

還是我誤解了你的問題?

PS:想快速查看字典的的plist結構,創建一個模擬詞典的NSLog它的描述,看看它是如何應該是(或將writeToFile看到該文件的內容或課程的參考文檔)

編輯

您使用上面的代碼將提供的plist文件加載到字典中。然後您檢索中它的另一個字典使用

NSDictionary *city = [dict valueForKey : @"yourZipCodeHere"]; 

從該字典,你得到cityCode這樣

NSString *cityCode = [city valueOrKey: @"City Code"]; 

至於你的問題的範圍,我不知道我完全理解它。但你可以得到所有的郵政編碼使用

NSArray *zipArray = [dict allKeys]; 

然後你可以簡單地迭代,以獲得正確的郵政編碼。 PS:我不知道太多的蘋果腳本,並會對如何將xls轉換爲plist使用它感興趣。

+0

我需要檢索城市代碼,提供一個在給定城市範圍內的ZIPCODE。請看我製作的示例plist文件。 – fundidor

+0

請查看我編輯過的用於轉換的scpt文件中的鏈接。 – fundidor

1

我會使用indexOfObjectPassingTest:做這種搜索。這樣的事情:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 

    NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"cityCodes" ofType:@"plist"]; 
    self.cityCodes_dictionary = [NSDictionary dictionaryWithContentsOfFile:plistPath]; 
    [self findCityWithZip:@"01123010"]; 
} 

-(void)findCityWithZip:(NSString *) searchZip { 
    NSUInteger indx = [self.cityCodes_dictionary.allKeys indexOfObjectPassingTest:^BOOL(NSString *zip, NSUInteger idx, BOOL *stop) { 
     NSString *startZipCode = [zip substringWithRange:NSMakeRange(0, 8)]; 
     NSString *finalZipCode = [zip substringWithRange:NSMakeRange(8, 8)]; 
     return (searchZip.integerValue < finalZipCode.integerValue && searchZip.integerValue > startZipCode.integerValue); 
    }]; 
    NSLog(@"%@",[self.cityCodes_dictionary valueForKey:[self.cityCodes_dictionary.allKeys objectAtIndex:indx]]); 
}