Отрязване на низови стойности от txt файл и добавяне към масива

Имам txt файл, който беше копиран в поддържащи файлове на моя Xcode проект. Данните в txt файла са във формат:

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 е пакет, съдържащ множество низове, ако опитам някой от тези методи, получава само abacus добавен към масива, но искам абакус, абате, абдикация, аберация да бъдат добавени към масива.

РЕДАКТИРАНЕ

Следвайки предложението за 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 Значи искаш да кажеш, конвертиране на 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];

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

word1@explanation one
word2@explanation two

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

person Community    schedule 23.05.2013
comment
Благодаря за отговора, но той се срива на ред string characterAtIndex, изхвърляйки изключение: диапазон или индекс извън границите - person Eshwar Chaitanya; 23.05.2013
comment
@EshwarChaitanya Това показва празен низ (може би потърсете в Google съобщението за изключение!?) - person ; 23.05.2013
comment
Изненадващо е да чуя, че тъй като greFileString не е празен, когато се регистрира, можех да видя изхода същия като този в txt файл, т.е.: низът е сметало@рамка с топки за изчисляване намаляване @намаляване, за да изчезне абдикация@отказване на аберация на контролния орган @отклоняване от това, което е нормално, подбуждам@помагам/насърчавам някого (да постъпя погрешно) въздържание@отложено действие отвращавам се@мразя да ненавиждам да спазвам@да бъда верен да издържам отказвам се@обещавам или се закълна да се откажа и т.н. - 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
Моят txt файл е във формат: pastebin.com/SDT7e152, така че когато потърсих в Google начини за конвертиране на файла в към plist, array и т.н. Намерих решение за поставяне в масив, т.е. с помощта на низ, който използва пакет, за да получи всички данни, използвайки съдържанието на файла. След това поставянето в масив би използвало компоненти на низ, разделени по метод. Но това променя естеството на оригиналния изход, т.е. както е споменато в регистрираните изходни данни. Така че аз се опитвах да ви попитам как да добавя txt файла към масива, без да променя типа на данните. - person Eshwar Chaitanya; 23.05.2013
comment
Считайте ме за безнадежден и моля, помогнете ми, внедрих това, което казахте, добавяйки масив към речника, дори тогава получавам резултат в някакъв друг формат: re dictionary is { greWordsArray = ( abacus@frame, with, balls, for, calculating, , abate@to, lessen, to, subside, , за какво е това?? Искам думи преди @ в един масив и след @ в друг, моля разберете - person Eshwar Chaitanya; 23.05.2013
comment
@EshwarChaitanya С други думи, вие не сте описали проблема и формата на вашия текстов файл правилно. След това можете да използвате метода componentsSeparatedByString: на NSString в този случай. Не ме обвинявайте, че не успяхте да обясните проблема си по разбираем начин. - person ; 23.05.2013
comment
,Съжалявам, че не успях да направя въпроса си точен и разбираем за вас, опитах string componentsSeparatedByString, т.е. self.greWordsArray = [NSMutableArray arrayWithArray:[greFileString componentsSeparatedByString:@@]]; и получи изход като: gre думи са ( сметало, рамка с топчета за изчисляване \naбате, за намаляване, за да отслабне \nabdication, отказване от властта за контрол \naberration, отклоняване от това, което е нормално \nabet, помощ/насърчаване на някого (при извършване на грешка ) \nподдържане, спряно действие, сега какво да правя - 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