3

iOS でテキスト文字列を操作および処理するための最適なプログラミング アプローチを見つけたいと考えていました。ありがとう!

次のような文字を操作するために、文字列を含むファイルを取得します。

NQXB26JT1RKLP9VHarren              Daggett B0BMAF00SSQ   ME03B98TBAA8D

NBQB25KT1RKLP05Billison             Whiner X0AMAF00UWE   8E21B98TBAF8W

...

...

...

各文字列は順番に処理され、次の文字列にループします。

名前と次の文字列を取り除きます。

次の 3 つの文字列フラグメントを取り、別の基数に変換します。新しい結果を処理するコードがありますが、これらの短い文字列を連続して処理するために送信する方法が不明です。

QXB26

B0BM

BAA8

次に、結果をファイルに出力します。xxx は変換された数値を表します。

xxxxxxxxx   Harren Daggett   xxxxxxxx  xxxxxxxx

xxxxxxxxx   Billison  Whiner xxxxxxxx  xxxxxxxx

...

...

...

最終結果は、最初のファイルから文字列の一部を取り出し、目的の結果で新しいファイルを作成します。

4

1 に答える 1

2

目的を達成する方法はいくつかありますが、シンプルで適度にデバッグしやすいものが必要な場合は、特定した各フィールド (数字、名前) の固定位置で各レコードを単純に分割できます。次に、単純な正規表現 replace を使用して名前を圧縮し、すべてを元に戻します。

このような目的のために、私は簡単にフォローしてデバッグできるシンプルな (そして少し平凡な) ソリューションを好みます。そのため、この例は最適化されていません。

NSFileManager *fm = [NSFileManager defaultManager];
NSArray *URLs = [fm URLsForDirectory: NSDocumentDirectory
                           inDomains: NSUserDomainMask];

NSURL *workingdirURL = URLs.lastObject;
NSURL *inputFileURL  = [workingdirURL URLByAppendingPathComponent:@"input.txt" isDirectory:NO];
NSURL *outputFileURL = [workingdirURL URLByAppendingPathComponent:@"output.txt" isDirectory:NO];

// For the purpose of this example, just read it all in one chunk
NSError *error;
NSString *stringFromFileAtURL = [[NSString alloc]
                                 initWithContentsOfURL:inputFileURL
                                 encoding:NSUTF8StringEncoding
                                 error:&error];

if ( !stringFromFileAtURL) {
    // Error, do something more intelligent that just returning
    return;
}


NSArray *records = [stringFromFileAtURL componentsSeparatedByCharactersInSet: [NSCharacterSet newlineCharacterSet]];

NSMutableArray *newRecords = [NSMutableArray array];

for (NSString *record in records) {

    NSString *firstNumberString  = [record substringWithRange:NSMakeRange(1, 5)];
    NSString *nameString         = [record substringWithRange:NSMakeRange(15, 27)];
    NSString *secondNumberString = [record substringWithRange:NSMakeRange(43, 4)];
    NSString *thirdNumberString  = [record substringWithRange:NSMakeRange(65, 4)];

    NSString *condensedNameString = [nameString stringByReplacingOccurrencesOfString:@" +"
                                                                          withString:@" "
                                                                             options:NSRegularExpressionSearch
                                                                               range:NSMakeRange(0, nameString.length)];

    NSString *newRecord = [NSString stringWithFormat: @"%@ %@ %@ %@",
                           convertNumberString(firstNumberString),
                           condensedNameString,
                           convertNumberString(secondNumberString),
                           convertNumberString(thirdNumberString) ];

    [newRecords addObject: newRecord];
}

NSString *outputString = [newRecords componentsJoinedByString:@"\n"];

[outputString writeToURL: outputFileURL
              atomically: YES
                encoding: NSUTF8StringEncoding
                   error: &error];

この例convertNumberStringは、数字の文字列を変換する単純な C 関数です。もちろん、アーキテクチャや好みによっては、メソッドになることもあります。

于 2013-02-15T10:26:49.167 に答える