0

ブラジル政府当局から提供されたこの小さな Excel ファイルがあります。これには、ブラジルの各都市のレコード、各都市の郵便番号範囲、およびその「都市コード」が含まれています。

特定の都市の「都市コード」を取得する必要があります。

郵便番号の範囲を表示する最初の 2 つの列に基づいて、都市の特定の郵便番号を解析し、その「都市コード」を返すのが最善の方法だと思います。

AppleScript を使用して、指定された Excel ファイルの plist ファイルをコンパイルできると確信しています。しかし、ZIPコードを解析したら、plistファイルから特定のエントリを取得するために、objectiveCコードの数行を教えてもらえますか?

http://www.idanfe.com/dl/codes.xls.zipの Excel ファイルを参照してください。

ありがとう。

サンプルの plist ファイルをhttp://www.idanfe.com/dl/cityCodes.plistにアップロードしました

さらなる説明:

01001000 から 05895490 の範囲にある 01123010 のような ZIP CODE 値を解析します。したがって、私のルーチンは City Code = 3550308 および City Name = São Paulo を返すはずです。

これを達成する方法がわかりません。サンプル plist を間違って作成した可能性があります。

AppleScript を使用して、Excel シートから読み取って plist ファイルを作成できると確信しています。

しかし、特定の ZIP CODE 範囲の市区町村コードを取得するのは難しい作業です。

+++ 編集: +++

私はそれを解決したと思いますが、私が書くほとんどすべてのように、それはちょっと不器用に見えます.

この 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");
    }
}

基本的に、start zipCode と finalZip Code を 16 桁の 1 つの文字列に追加するので、plist ファイルに 1 つのレコードを作成します。

次に、City Code を検索するときに、長いキー (2 つの郵便番号) を 2 つに分割し (通常の zipCode に戻します)、cityCode が必要な特定の zipCode に適合するレコードを検索します。

いくつかの方法は私には最適ではありませんが、驚いたことに、コードは非常に高速ですが、ループ内にあります。

コメントいただければ幸いです...

ありがとう、

4

2 に答える 2

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]]);
}
于 2012-10-22T04:18:53.590 に答える
0

plist が辞書として構成されている場合、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 に変換する方法に興味があります。

于 2012-10-19T15:59:47.470 に答える