7

3 つの列を持つ .csv ファイルを読み取る必要があります。.csv ファイルを解析しているときに、Christopher Bass,\"Cry the Beloved Country Final Essay\",cbass@cgs.k12.va.us という形式の文字列を取得します。3列の値を配列に格納したいのでcomponentSeparatedByString:@","メソッドを使いました!3 つのコンポーネントを含む配列が正常に返されます。

  1. クリストファー・バス
  2. 最愛の国を泣かせ 最終エッセイ
  3. cbass@cgs.k12.va.us

ただし、このChristopher Bass,\"Cry, the Beloved Country Final Essay\",cbass@cgs.k12.va.us のように、列の値に既にカンマがある場合 、文字列が 4 つのコンポーネントに分割されます。 (コンマ) Cry の後:

  1. クリストファー・バス
  2. 泣く
  3. 最愛の国最終エッセイ
  4. cbass@cgs.k12.va.us

では、正規表現を使用してこれを処理するにはどうすればよいですか。「RegexKitLite」クラスがありますが、どの正規表現を使用すればよいですか。助けてください!

ありがとう-

4

5 に答える 5

2

正規表現はおそらく同じ問題になります。必要なのは、コンマをエスケープするか、次のように文字列を強調表示して、エントリまたは文字列をサニタイズすることです"My string"。そうしないと、同じ問題が発生します。幸運を。

あなたの例では、おそらく次のようなことをする必要があります:

\"Christopher Bass\",\"Cry\, the Beloved Country Final Essay\",\"cbass@cgs.k12.va.us\"

そうすれば、正規表現またはNSStringクラスの同じメソッドを使用できます。

まったく関係ありませんが、文字列をサニタイズすることの重要性: http://xkcd.com/327/へへへ。

于 2012-01-31T17:06:35.093 に答える
1

これはどう:

componentsSeparatedByRegex:@",\\\"|\\\","

これにより、文字列がどこでも分割され、いずれかの順序で一緒",表示され、3 メンバー配列になります。もちろん、これは、文字列の 2 番目の要素が常に括弧で囲まれていること、および文字",が 3 つのコンポーネント内で連続して出現しないことを前提としています。

これらの仮定のいずれかが正しくない場合、文字列コンポーネントを識別する他の方法を使用できますが、一般的な解決策が存在しないことを明確にする必要があります。3 つのコンポーネント文字列に任意の場所に"andを含めること,ができる場合、そのような場合には限られた解決策すらありません。

Doe, John,\"\"Why Unescaped Strings Suck\", And Other Development Horror Stories\",Doe, John <john.doe@dev.null>

CSV データに上記のようなものがないことを願っています。存在する場合、データは基本的に使用できず、より優れた CSV エクスポーターを検討する必要があります。

于 2012-02-09T19:22:12.983 に答える
0

最後の部分は、コンマが含まれないように見えます。私が見る限り、最初のものもそうではありません...

このように文字列を分割するのはどうですか?

NSArray *splitArr = [str componentsSeparatedByString:@","];
NSString *nameStr = [splitArr objectAtIndex:0];
NSString *emailStr = [splitArr lastObject];

NSString *contentStr = @"";
for(int i=1; i<[splitArr count]-1; ++i) {
    contentStr = [contentStr stringByAppendingString:[splitArr objectAtIndex:i]];
}

これにより、最初と最後の文字列がそのまま使用され、残りがコンテンツに結合されます。

ハックのようなものですが、名前とメールアドレスにコンマが含まれることはありませんよね?

于 2012-02-09T13:56:57.763 に答える
0

タイトルに引用符が付いていることは保証されていますか?そして、それはそれらを持つことができる唯一のコンポーネントですか?それならcomponentSeparatedByString:@"\""あなたにこれを手に入れるべきだから:

  1. クリストファーバス、
  2. 最愛の国の最終エッセイ、クライ
  3. 、cbass @ cgs.k12.va.us

次に、componentSeparatedByString:@","またはsubstringFrom/ToIndex:を使用して、最初と最後のコンポーネントの2つのコンマを削除します。

サブストリングを使用した解決策は次のとおりです。

NSString* input = @"Christopher Bass,\"Cry, the Beloved Country Final Essay\",cbass@cgs.k12.va.us";
NSArray* split = [input componentsSeparatedByString:@"\""];
NSString* part1 = [split objectAtIndex:0];
NSString* part2 = [split objectAtIndex:1];
NSString* part3 = [split objectAtIndex:2];
part1 = [part1 substringToIndex:[part1 length] - 1];
part3 = [part3 substringFromIndex:1];

NSLog(part1);
NSLog(part2);
NSLog(part3);
于 2012-02-09T09:49:22.640 に答える
0

探している正規表現は次のとおりです。\\"(.*)\\"[ ^,]*|([^,]*),

ObjC で:(('\"' && string_1 && '\"' && 0-n spaces) || string_2 except comma) && comma

NSString *str = @"Christopher Bass,\"Cry, the Beloved Country ,Final Essay\",cbass@cgs.k12.va.us,som";
NSString *regEx = @"\\\"(.*)\\\"[ ^,]*|([^,]*),";
NSMutableArray *split = [[str componentsSeparatedByRegex:regEx] mutableCopy];
[split removeObject:@""]; // because it will print always both groups even if the other is empty
NSLog(@"%@", split);

// OUTPUT:
2012-02-07 17:42:18.778 tmpapp[92170:c03] (
    "Christopher Bass",
    "Cry, the Beloved Country ,Final Essay",
    "cbass@cgs.k12.va.us",
    som
)

RegexKitLite は両方の文字列を配列に追加するため、配列に空のオブジェクトが作成されます。removeObject:@""はそれらを削除しますが、真の空の値を維持する必要がある場合 (たとえば、ソースに がval,,ueある場合)、コードを次のように変更する必要があります。

str = [str stringByReplacingOccurrencesOfRegex:regEx withString:@"$1$2∏"];
NSArray *split = [str componentsSeparatedByString:@"∏"];

$1 と $2 は上記の 2 つの文字列です。この場合、∏ は通常のテキストには表示されない可能性が最も高い文字です (覚えやすいです: option-shift-p)。

于 2012-02-07T17:11:23.580 に答える