标记和解析文本文件(编辑决策列表ASCII文本文件)目标C



我是编程和stackoverflow的新手,决定从学习目标c开始。

在最深处,我知道。

我一直在努力找出解析edl文件的最佳方法。它基本上是一个不超过100KB的ASCII文本文件。以下是典型的cmx3600 edl:的结构

TITLE:   EP1 FINAL.EDL SECTION2
FCM: NON-DROP FRAME
001  A199_C00 V     C        20:38:24:15 20:38:26:04 10:30:00:02 10:30:01:16
* SOURCE FILE: A199_C008_0915AH_001
002  A199_C00 V     C        20:34:48:17 20:34:51:23 10:30:01:16 10:30:04:22
* SOURCE FILE: A199_C007_0915VE_001

我正在努力找出将每个元素解析或扫描到字段/数组中的最佳方法,即

editNum = 001
tapeName = A199_C00
channel = V
Operation = C
sourceIn = 20:38:24:15
sourceOut = 20:38:26:04
recIn = 10:30:00:02
recOut = 10:30:01:16
sourceFile = A199_C008_0915AH_001

这是我迄今为止的代码:

-(IBAction)importEdl:(id)sender {    
    //defines an Array of allowed file types with file extension ".EDL and .edl"
    NSOpenPanel *myPanel = [NSOpenPanel openPanel];
    NSArray *fileTypes = [NSArray arrayWithObjects:@"EDL", @"edl", nil];
    myPanel.allowedFileTypes = fileTypes;
    myPanel.allowsMultipleSelection = NO;
    if ([myPanel runModal] == NSOKButton)
    {            
    NSString *theFilePath = [myPanel filename];
    NSString *psEdlFile = [NSString stringWithContentsOfFile:theFilePath encoding:NSASCIIStringEncoding error:NULL];
        // Reads the file as one string. EDL's are simple ASCII text files of roughly 50KB.
    NSArray *psEdlLines = [psEdlFile componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];   
        // Separates the data into lines.
    if([psEdlLines count] == 0)
    {
        NSLog(@"Error!");                                  
    } //prints error if EDL file has no events.

    NSUInteger count;
    int i;
    for (i = 0, count = [psEdlLines count]; i < count; i = i + 1)
    {
        NSString *lineStrings = [psEdlLines objectAtIndex:i];
        NSLog(@"Line %d is %@",i+1,lineStrings);
    //NSArray *linesEnum = [psEdlLines objectAtIndex:i];
        //this creates an array of lines
    //NSLog(@"index is: %d %@",i, linesEnum);
    }
    }                
}
@end

输出为:

2012-03-20 15:22:08.956 TestProgram[412:903] Line 1 is TITLE:   EP1 FINAL.EDL SECTION2
2012-03-20 15:22:08.957 TestProgram[412:903] Line 2 is FCM: NON-DROP FRAME
2012-03-20 15:22:08.957 TestProgram[412:903] Line 3 is 001  A199_C00 V     C        20:38:24:15 20:38:26:04 10:30:00:02 10:30:01:16
2012-03-20 15:22:08.957 TestProgram[412:903] Line 4 is * SOURCE FILE: A199_C008_0915AH_001
2012-03-20 15:22:08.957 TestProgram[412:903] Line 5 is 002  A199_C00 V     C        20:34:48:17 20:34:51:23 10:30:01:16 10:30:04:22
2012-03-20 15:22:08.957 TestProgram[412:903] Line 6 is * SOURCE FILE: A199_C007_0915VE_001
2012-03-20 15:22:08.957 TestProgram[412:903] Line 7 is 003  A199_C00 V     C        20:42:32:01 20:42:35:19 10:30:04:22 10:30:08:15
2012-03-20 15:22:08.957 TestProgram[412:903] Line 8 is * SOURCE FILE: A199_C009_0915RX_001
2012-03-20 15:22:08.957 TestProgram[412:903] Line 9 is 
2012-03-20 15:22:08.958 TestProgram[412:903] Line 10 is 

如你所见,我还没走多远。任何想法都将不胜感激。提前感谢,皮特。

好的,

我一直试图通过使用NSScanner和行前缀来解决这个问题。我可以扫描以数字开头的行(事件),还可以隔离与每个相应事件相关的注释和效果。

这是代码:

for (NSString *line in psEdlLines)// just an NSLog test before scanning process 
    {
        NSLog(@"Before scanner: %@",line);//All lines.
    }
for (NSString *line in psEdlLines)// Scanner process.
        {
        int eventNum;
        NSString *comment;
        NSString *effect;
        NSScanner *lineScanner = [NSScanner scannerWithString:line];
while ([lineScanner scanInt:&eventNum]) 
        {
            NSLog(@"Scanner: Event only: %@:", line);
        }
    if ([line hasPrefix:@"*"]) 
        {
                comment = [line substringFromIndex:0];
            NSLog(@"Comment for event    %03i: %@",eventNum, comment);
        }
    if ([line hasPrefix:@"M2"]) 
            {
                effect = [line substringFromIndex:0];
            NSLog(@"Effect for event     %03i:    %@",eventNum, effect);
            }
}
@end

以下是一个3事件edl文件的输出:

2012-03-23 14:23:48.040 TestProgram[1621:903] Before scanner: TITLE:   EP1 FINAL.EDL SECTION2
2012-03-23 14:23:48.040 TestProgram[1621:903] Before scanner: FCM: NON-DROP FRAME
2012-03-23 14:23:48.040 TestProgram[1621:903] Before scanner: 001  A180_C00 V     C        20:29:12:18 20:29:13:21 10:46:39:20 10:46:40:23
2012-03-23 14:23:48.040 TestProgram[1621:903] Before scanner: * SOURCE FILE: A180_C001_09138L_001
2012-03-23 14:23:48.040 TestProgram[1621:903] Before scanner: 002  A181_C01 V     C        22:10:03:03 22:10:05:09 10:46:40:23 10:46:43:04
2012-03-23 14:23:48.040 TestProgram[1621:903] Before scanner: * SOURCE FILE: A181_C010_0913EA_001
2012-03-23 14:23:48.040 TestProgram[1621:903] Before scanner: 003  A181_C01 V     C        22:10:05:09 22:10:05:10 10:46:43:04 10:46:43:09
2012-03-23 14:23:48.040 TestProgram[1621:903] Before scanner: M2   A181_C01       000.0                22:10:05:09
2012-03-23 14:23:48.041 TestProgram[1621:903] Before scanner: * * FREEZE FRAME
2012-03-23 14:23:48.041 TestProgram[1621:903] Before scanner: * SOURCE FILE: A181_C010_0913EA_001
2012-03-23 14:23:48.041 TestProgram[1621:903] Before scanner: 
2012-03-23 14:23:48.041 TestProgram[1621:903] Scanner: Event only: 001  A180_C00 V     C        20:29:12:18 20:29:13:21 10:46:39:20 10:46:40:23:
2012-03-23 14:23:48.041 TestProgram[1621:903] Comment for event    001 * SOURCE FILE: A180_C001_09138L_001
2012-03-23 14:23:48.041 TestProgram[1621:903] Scanner: Event only: 002  A181_C01 V     C        22:10:03:03 22:10:05:09 10:46:40:23 10:46:43:04:
2012-03-23 14:23:48.041 TestProgram[1621:903] Comment for event    002 * SOURCE FILE: A181_C010_0913EA_001
2012-03-23 14:23:48.042 TestProgram[1621:903] Scanner: Event only: 003  A181_C01 V     C        22:10:05:09 22:10:05:10 10:46:43:04 10:46:43:09:
2012-03-23 14:23:48.042 TestProgram[1621:903] Effect for event     003    M2   A181_C01       000.0                22:10:05:09
2012-03-23 14:23:48.042 TestProgram[1621:903] Comment for event    003 * * FREEZE FRAME
2012-03-23 14:23:48.042 TestProgram[1621:903] Comment for event    003 * SOURCE FILE: A181_C010_0913EA_001

我可以为edl文件的注释行中可能出现的所有事件添加if语句。这应该允许我根据需要处理循环中的每个行元素。

这个看起来还好吗?

谢谢,皮特。

更多进展。

if ([lineScanner scanInt:&eventNum])
    {
        // parse the event into fields
        // does not work if edl contains dissolve or wipe
        // need to automatically convert dissolves into cuts
         NSString *editNum;
         NSString *reelName;
         NSString *channels;
         NSString *operation;
         //NSString *opDuration;
         NSString *sourceInTime;
         NSString *sourceOutTime;
         NSString *destInTime;
         NSString *destOutTime;
        NSScanner *elementScanner = [NSScanner scannerWithString:line];
        //NSString *token = [NSString string];
        NSCharacterSet *divider = [NSCharacterSet whitespaceCharacterSet];
        [elementScanner scanUpToCharactersFromSet:divider intoString:&editNum];
        [elementScanner scanUpToCharactersFromSet:divider intoString:&reelName];
        [elementScanner scanUpToCharactersFromSet:divider intoString:&channels];
        [elementScanner scanUpToCharactersFromSet:divider intoString:&operation];
        //[elementScanner scanUpToCharactersFromSet:divider intoString:&opDuration];
        [elementScanner scanUpToCharactersFromSet:divider intoString:&sourceInTime];
        [elementScanner scanUpToCharactersFromSet:divider intoString:&sourceOutTime];
        [elementScanner scanUpToCharactersFromSet:divider intoString:&destInTime];
        [elementScanner scanUpToCharactersFromSet:divider intoString:&destOutTime];

        NSLog(@"EventtReelNametChannelstOperationtSource IntSource OuttDest InttDest Out");
        NSLog(@"%@t%@t%@ttt%@ttt%@t%@t%@t%@", 
              editNum, reelName, channels, operation, /*opDuration,*/ sourceInTime, sourceOutTime, destInTime,destOutTime);
    }

输出以下内容。

2012-03-29 15:54:15.489 TestProgram[2414:903] Scanner:Title = EP1 FINAL.EDL SECTION2
2012-03-29 15:54:15.489 TestProgram[2414:903] Event ReelName    Channels    Operation   Source In   Source Out  Dest In     Dest Out
2012-03-29 15:54:15.489 TestProgram[2414:903] 001   A180_C00    V           C           20:29:12:18 20:29:13:21 10:46:39:20 10:46:40:23
2012-03-29 15:54:15.489 TestProgram[2414:903] Comment for event    001 * SOURCE FILE: A180_C001_09138L_001
2012-03-29 15:54:15.489 TestProgram[2414:903] Event ReelName    Channels    Operation   Source In   Source Out  Dest In     Dest Out
2012-03-29 15:54:15.490 TestProgram[2414:903] 002   A181_C01    V           C           22:10:03:03 22:10:05:09 10:46:40:23 10:46:43:04
2012-03-29 15:54:15.490 TestProgram[2414:903] Comment for event    002 * SOURCE FILE: A181_C010_0913EA_001
2012-03-29 15:54:15.490 TestProgram[2414:903] Event ReelName    Channels    Operation   Source In   Source Out  Dest In     Dest Out
2012-03-29 15:54:15.490 TestProgram[2414:903] 003   A181_C01    V           C           22:10:05:09 22:10:05:10 10:46:43:04 10:46:43:09
2012-03-29 15:54:15.490 TestProgram[2414:903] Effect for event     003    M2   A181_C01       000.0                22:10:05:09
2012-03-29 15:54:15.491 TestProgram[2414:903] Comment for event    003 * * FREEZE FRAME
2012-03-29 15:54:15.491 TestProgram[2414:903] Comment for event    003 * SOURCE FILE: A181_C010_0913EA_001

最新更新