Усекать строковые значения из txt файла и добавлять в массив

У меня есть текстовый файл, который был скопирован во вспомогательные файлы моего проекта Xcode. Данные в текстовом файле имеют формат:

abacus@frame with balls for calculating

abate@to lessen to subside

abdication@giving up control authority

aberration@straying away from what is normal

....................around 4000 lines

Я успешно извлек данные из файла, используя следующий код:

NSString *greFileString = [NSString stringWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"grewords" ofType:@"txt"] encoding:NSUTF8StringEncoding error:nil];
self.greWordsArray = [NSMutableArray arrayWithArray:[greFileString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];

Когда я печатаю greWordsArray, я вижу следующий вывод в журнале

"abacus@frame",
with,
balls,
for,
calculating,
"",
"abate@to",
lessen,
to,
subside,
"",
"abdication@giving",
up,
control,
authority,
"",
"aberration@straying",
away,
from,
what,
is,
normal,
"",

Но я хочу, чтобы значения в двух отдельных массивах, один из которых содержал счеты, уменьшение, отречение, аберрацию авторитета и другой массив с рамкой с шарами для вычисления, уменьшались, чтобы спадать, отказываясь от контроля, отклоняясь от того, что нормально, т.е. один массив, содержащий строку до символа @ и один с символом после @

Я знаю, что есть несколько методов, таких как проверка метода специального символа, строки путем замены вхождений строки с использованием набора символов, но дело в том, что моя строка greFileString представляет собой пакет, содержащий несколько строк, если я попробую любой из этих методов, только счеты получат добавлен в массив, но я хочу, чтобы счеты, уменьшение, отречение, аберрация были добавлены в массив.

ИЗМЕНИТЬ

Следуя предложению H2CO3, я реализовал следующим образом:

NSString *greFileString = [NSString stringWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"grewords" ofType:@"txt"] encoding:NSUTF8StringEncoding error:nil];
NSArray *greData = [NSArray arrayWithArray:[greFileString componentsSeparatedByString:@"@"]];
self.greWordsArray = [NSMutableArray array];
self.greWordHints = [NSMutableArray array];
for (NSString *greWord in greData)
{
   if ([greWord characterAtIndex:0] == (unichar)'@')
   {
     [greWordHints addObject:greWord];
   }
   else
   {
     [greWordsArray addObject:greWord];
   }
}
NSLog(@"gre words are %@",greWordsArray);
NSLog(@"gre hints are %@",greWordHints);

Вот зарегистрированный вывод:

gre words are (
    abacus,
    "frame with balls for calculating
\nabate",
    "to lessen to subside
\nabdication",
    "giving up control authority
\naberration",
    "straying away from what is normal
\nabet",
    "help/encourage somebody (in doing wrong)
\nabeyance",
    "suspended action
\nabhor",
    "to hate to detest

gre hints are (
)

Может ли кто-нибудь помочь мне в этом?


person Eshwar Chaitanya    schedule 23.05.2013    source источник
comment
Рассмотрите возможность использования plist. stackoverflow.com/questions/7059966 /   -  person KishoreK    schedule 23.05.2013
comment
@KishoreK Я уже знаю об использовании plist, но кому-то довольно легко обработать около 100 или 200 слов, на самом деле файл txt содержит около 4000+ строк, поэтому у меня не было другого варианта, кроме как извлекать данные из txt и сохранение в массив :)   -  person Eshwar Chaitanya    schedule 23.05.2013
comment
@EshwarChaitanya Почему вы не можете хранить 4000 записей в plist?   -  person    schedule 23.05.2013
comment
@H2CO3 Мне нужно ввести все 4000 записей в plist, что отнимает много времени и немного обременительно для меня, так как мне приходится вести отдельные списки, один для слов, а другой для их подсказок, слова перед символом @, а подсказки после символ @ во всех 4000 строках, пожалуйста, проверьте в сообщении формат данных в txt-файле, или я могу узнать, как преобразовать txt-файл в plist ??   -  person Eshwar Chaitanya    schedule 23.05.2013
comment
@EshwarChaitanya 1. Зачем использовать отдельные списки свойств, если можно использовать словари? 2. Когда у вас есть массив строк, вы просто записываете их из NSArray или переносите массив в словарь, записываете этот словарь и бум, у вас есть список свойств... Я не могу поверить, что исследование этого так тяжело...   -  person    schedule 23.05.2013
comment
@ H2CO3 H2CO3 Итак, вы хотите сказать, что преобразование txt-файла в массив, затем добавление массива в словарь и, наконец, добавление этого словаря в plist, не кажется ли этот процесс длительным?   -  person Eshwar Chaitanya    schedule 23.05.2013
comment
@EshwarChaitanya Класс NSDictionary делает это менее чем за 0,1 секунды ... и вы все равно делаете это только один раз ...   -  person    schedule 23.05.2013
comment
Даже еще 5-10 голосов против не имеют для меня большого значения, люди должны понимать, что не все хороши в исследованиях и разработках или кодировании, но я прошу их указать причину в комментарии при голосовании против!!   -  person Eshwar Chaitanya    schedule 23.05.2013


Ответы (2)


Это довольно тривиально: если первый символ строки — '@', то поместить его в один массив, иначе — в другой.

NSArray *words = [greFileString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSMutableArray *at = [NSMutableArray array];
NSMutableArray *noAt = [NSMutableArray array];

for (NSString *s in words)
    if ([s characterAtIndex:0] == (unichar)'@')
        [at addObject:s];
    else
        [noAt addObject:s];

Не обращайте внимания на вышеизложенное - ОП лгал мне>. ‹ Текстовый файл фактически состоит из строк, в которых символ at разделяет слово и объяснение, т.е. е.

word1@explanation one
word2@explanation two

и т.д. Это означает, что сначала нужно извлечь строки (возможно, с помощью - [NSString componentsSeparatedByString:]), затем каждую строку разбить на две части (такой же метод полезен и здесь).

person Community    schedule 23.05.2013
comment
Спасибо за ответ, но он падает в строке characterAtIndex, выбрасывая исключение: диапазон или индекс за пределами - person Eshwar Chaitanya; 23.05.2013
comment
@EshwarChaitanya Это указывает на пустую строку (возможно, погуглите сообщение об исключении !?) - person ; 23.05.2013
comment
Удивительно слышать это, поскольку greFileString не пуста, при входе в систему я мог видеть вывод такой же, как и в txt-файле, то есть: строка - это счеты @ кадр с шариками для расчета abate @ уменьшить до уменьшения abdication @ отказ от управления аберрацией @отклоняться от того, что является нормальным подстрекать@помогать/поощрять кого-либо (в неправильных поступках) воздерживаться@приостановить действие ненавидеть@ненавидеть ненавидеть соблюдать@быть верным терпеть отрекаться@обещать или поклясться сдаться и т.д. - person Eshwar Chaitanya; 23.05.2013
comment
@EshwarChaitanya Пустая строка, а не пустой файл. Посмотрите на последнюю запись в ваших выходных данных. Это "". Это пустая строка. - person ; 23.05.2013
comment
Да, я признаю то же самое, но, вероятно, это связано с использованием набора символов для добавления строки пакета в массив, знаете ли вы, как добавить строку пакета, то есть формат, упомянутый в выводе выше в комментарии, если да, пожалуйста, сообщите мне - person Eshwar Chaitanya; 23.05.2013
comment
@EshwarChaitanya Теперь я не мог понять этот вопрос. - person ; 23.05.2013
comment
Мой текстовый файл имеет формат: pastebin.com/SDT7e152, поэтому, когда я искал способы конвертировать файл в plist, массив и т. д. Я нашел решение для размещения в массиве, т.е. с помощью строки, которая использует пакет для получения всех данных с использованием содержимого файла. Затем размещение в массиве будет использовать строковые компоненты, разделенные методом. Но это меняет характер исходного вывода, т.е. как указано в зарегистрированных выходных данных. Итак, я пытался спросить вас, как добавить текстовый файл в массив без изменения типа данных. - person Eshwar Chaitanya; 23.05.2013
comment
Считайте меня безнадежным и, пожалуйста, помогите мне, я реализовал то, что вы сказали, добавив массив в словарь, даже тогда я получаю вывод в каком-то другом формате: словарь re is { greWordsArray = ( abacus@frame, with, balls, for, calculate, , abate@to, lessen, to, subside, , для чего это??Я хочу слова перед @ в одном массиве и после @ в другом,пожалуйста поймите - person Eshwar Chaitanya; 23.05.2013
comment
@EshwarChaitanya Другими словами, вы неправильно описали проблему и формат вашего текстового файла. В этом случае вы можете использовать метод componentsSeparatedByString: из NSString. Не вините меня в том, что вы не смогли доступно объяснить свою проблему. - person ; 23.05.2013
comment
, Сожалею, что не смог сделать свой вопрос точным и понятным для вас, я пробовал строковые компонентыSeparatedByString, т.е. и получил вывод в виде: gre слова ( счеты, рамка с шариками для подсчета\nabate, уменьшить до ослабевания\nabdication, отказаться от контроля\naberration, отклониться от того, что нормально\nabet, помочь/поощрить кого-то (в неправильном поступке) )\nabeyance, действие приостановлено, что теперь делать - person Eshwar Chaitanya; 23.05.2013
comment
@EshwarChaitanya Теперь вы можете прочитать редактирование в моем ответе, выпить кофе и немного поспать, возможно, завтра вы сможете лучше понять все это ... - person ; 23.05.2013
comment
Да, я понял вашу точку зрения относительно использования того же метода еще раз, чтобы разбить каждую строку на 2, как я мог это сделать, я имею в виду, что на этот раз у нас есть массив вместо строки, компоненты, разделенные строковым методом, недоступны в массиве na, вот почему я был вынужден снова прокомментировать, спасибо за вашу заботу и помощь, но мне нужно спешить в ходе моего проекта :) - person Eshwar Chaitanya; 23.05.2013
comment
О, метод, который вы упомянули ранее в ответе, хорошо, постараюсь вернуться к вам - person Eshwar Chaitanya; 23.05.2013
comment
Извините, H2CO3, я отредактировал свой пост, не могли бы вы взглянуть на него, получается, что вывод такой же, как в txt-файле, без разделения строки :( - person Eshwar Chaitanya; 23.05.2013
comment
Решил мою проблему, пожалуйста, проверьте мой ответ выше, ваш ответ, безусловно, помог мне, поэтому я дал +1, но приму мой ответ, извините за это :) - person Eshwar Chaitanya; 24.05.2013
comment
Я не знаю, было ли у вас намерение подразнить меня, но практически говоря, вы хорошо руководили мной, но независимо от того, виновата ли я или вы, я не мог хорошо понять ваше решение, более того, вы не указали тактика добавления слов и подсказок в массивы с использованием метода objectAtIndex, поэтому я сказал, что приму свой ответ, поскольку я ясно и точно дал понять любому новичку, если это вообще вас беспокоит !! - person Eshwar Chaitanya; 24.05.2013

Наконец-то это заработало, изначально моя идея была правильной, но я не мог ее правильно реализовать. Прежде всего, нам нужно извлечь данные из txt-файла и поместить в массив. Затем, как упоминалось в H2CO3, нам нужно выполнить цикл, и здесь нам нужно реализовать компоненты, разделенные строкой. Теперь мы готовы с данными, что нужно сделать, это поместить данные в массивы, используя объект массива с индексом 0 в словах и 1 в подсказках, то есть:

NSString *greFileString = [NSString stringWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"grewords" ofType:@"txt"] encoding:NSUTF8StringEncoding error:nil];
self.greWordHints = [NSMutableArray array];
self.greWordsArray = [NSMutableArray array];
NSArray *greWords = [NSMutableArray arrayWithArray:[greFileString componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]];
for (NSString *greWord in greWords)
{
   if (greWord && greWord.length)
   {
       NSArray *trimmedGreData = [greWord componentsSeparatedByString:@"@"];
       [greWordsArray addObject:[trimmedGreData objectAtIndex:0]];
       [greWordHints addObject:[trimmedGreData objectAtIndex:1]];
   }
}

Надеюсь, это поможет кому-то, спасибо :)

person Eshwar Chaitanya    schedule 24.05.2013