文章を書く!村松 恒平さんの本『プロ編集者による文章上達秘伝スクール』を読んだ。なかなか文体が決まらず一歩踏み出せないでいたが、そんなに深く悩む必要もないとふっきれた。手順としては、まずはとにかく書く。で、まとまった文量が溜まってから、推敲なりすればいい。最初に大事なのは、書く「勢い」だ。という訳で、コンテンツ作成を進めていく。プロ編集者による文章上達秘伝スクール
まずは文章の完成を昨日は絵を3点ほど描いてみた。しかし、やはり、今まで絵を描く習慣がなかったせいもありまったく描けない。資料を見ながら模写するだけなら、何となくそれっぽくはなるのだが、時間がかかりすぎる。アプリをリリースするまでの時間が伸びるのも嫌なので、コンテンツは文章だけで作ることにする。
絵がうまくなりたい今まで、絵を描くことに大して興味もなく生きてきた。誰しもそんなもんだとも思うのだが、何か描けと言われても特に何も描けない。ただ、ゲームやらアプリを作る上で、絵心やデザインってのはどうしても必要になってくるものだ。外注できるほどの資金もないので、自分で何とか描いてみる事にする。上手くはなくてもいいが、インパクトのある絵は描きたい。
改行文字の含まれるCSVから二次元配列コンマ区切り、改行文字ありのCSVからデータを配列に格納しするコードがやっと完成した。せっかくなので記録しておく。// DataSource.h - - + - - + - - + - - + - - + - - + - - + - - + - - + - -#import @interface DataSource : NSObject@property NSString*originalText, // CSCファイルの文字列そのまま*cleanText, // CSVファイルから""を取り除いた文字列*headerRowText, // フィールド行の文字列*bodyText; // フィールド行以外の文字列@property NSArray*fields; // フィールド名@property NSMutableArray*words, // 単語*contents; // 行列2次元配列@property NSCharacterSet*separator, // 区切り文字*newliner; // 改行文字@property unsigned longfieldCount, // フィールド数rowCount; // 行数- (id) initWithCSV:(NSString *)filename separator:(NSString *)separator;// オーバーライドするアクセサ- (unsigned long)fieldCount;- (void)setFieldCount:(unsigned long)fieldCount;@end// DataSource.m - - + - - + - - + - - + - - + - - + - - + - - + - - + - -#import "DataSource.h"@implementation DataSource- (id)initWithCSV:(NSString *)filename separator:(NSString *)separator{ if (self = [super init]) { // CharacterSetの設定 { self.separator = [NSCharacterSet characterSetWithCharactersInString:separator]; self.newliner = [NSCharacterSet newlineCharacterSet]; } // CSVからoriginalTextへ格納 { NSBundle *bundle = [NSBundle mainBundle]; NSString *path = [bundle pathForResource:filename ofType:@"csv"]; self.originalText = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; } // originalから""を取り除く { self.cleanText = [self.originalText stringByReplacingOccurrencesOfString:@"\"" withString:@""]; } // フィールド行の文字列をheaderRowText経由でfieldsへ格納し、bodyTextも設定 { NSRange headRowRange = [self.cleanText lineRangeForRange:NSMakeRange(0, 0)]; self.headerRowText = [self.cleanText substringWithRange:headRowRange]; self.fields = [self.headerRowText componentsSeparatedByCharactersInSet:self.separator]; self.bodyText = [self.cleanText substringFromIndex:self.headerRowText.length]; } // 行数を求め、行数分の容量を確保したcontentsを用意 { NSArray *separateds = [self.cleanText componentsSeparatedByCharactersInSet:self.separator]; self.rowCount = (separateds.count - 1) / (self.fields.count - 1); self.contents = [NSMutableArray arrayWithCapacity:self.rowCount]; } // 行ごとに配列を作り、それをcontentsに配列として格納 { // けずっていく用の文字列を用意 NSString *bufStr = [NSString stringWithString:self.bodyText]; for (int i = 0; i < self.rowCount; i++) { // 検索範囲の設定 NSRange searchRange = NSMakeRange(0, bufStr.length); // ラストコンマ for (int i = 0; i < (self.fields.count - 1); i++) { NSRange foundLocation = NSMakeRange(0, 0); foundLocation = [bufStr rangeOfCharacterFromSet:self.separator options:NSCaseInsensitiveSearch range:searchRange]; searchRange.location = foundLocation.location + 1; searchRange.length = (bufStr.length - (foundLocation.location + 1)); } // 改行位置 NSRange foundLocation = [bufStr rangeOfCharacterFromSet:self.newliner options:NSCaseInsensitiveSearch range:searchRange]; if (foundLocation.location != NSNotFound) { // NSString -> NSArray -> _contents NSString *oneLineString = [bufStr substringToIndex:foundLocation.location]; NSArray *oneLineArray = [oneLineString componentsSeparatedByCharactersInSet:self.separator]; [self.contents addObject:oneLineArray]; // 格納した文字列を削除 bufStr = [bufStr substringFromIndex:foundLocation.location + 1]; continue; } else { NSString *lastLineString = [bufStr substringWithRange:[bufStr lineRangeForRange:searchRange]]; NSArray *lastArray = [lastLineString componentsSeparatedByCharactersInSet:self.separator]; [self.contents addObject:lastArray]; break; } } NSLog(@"%@", @"break!"); } } return self;}- (unsigned long)fieldCount{ if (self.fields) { return self.fields.count; } else { return 0; }}- (void)setFieldCount:(unsigned long)fieldCount{ self.fieldCount = fieldCount;}@end