From 72c4522db57b9699e1dc324f62dbeb036405f2c6 Mon Sep 17 00:00:00 2001 From: Bibiko Date: Tue, 16 Feb 2010 23:11:38 +0000 Subject: =?UTF-8?q?=E2=80=A2=20csv=20field=20mapper=20-=20added=20chance?= =?UTF-8?q?=20to=20align=20the=20csv=20field=20and=20table=20field=20names?= =?UTF-8?q?=20via=20'matching=20names'=20which=20uses=20the=20Levenshtein?= =?UTF-8?q?=20distance=20[first=20approach]=20if=20csv=20file's=20first=20?= =?UTF-8?q?line=20is=20an=20header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Source/SPFieldMapperController.m | 48 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) (limited to 'Source/SPFieldMapperController.m') diff --git a/Source/SPFieldMapperController.m b/Source/SPFieldMapperController.m index 84dfc4c8..42ac3b0d 100644 --- a/Source/SPFieldMapperController.m +++ b/Source/SPFieldMapperController.m @@ -27,6 +27,7 @@ #import "SPTableData.h" #import "TablesList.h" #import "SPArrayAdditions.h" +#import "SPStringAdditions.h" #import "SPConstants.h" @implementation SPFieldMapperController @@ -95,6 +96,7 @@ [importFieldNamesHeaderSwitch setState:importFieldNamesHeader]; + [self changeHasHeaderCheckbox:self]; [self changeTableTarget:self]; [[self window] makeFirstResponder:fieldMapperTableView]; if([fieldMappingTableColumnNames count]) @@ -162,7 +164,7 @@ - (BOOL)importFieldNamesHeader { - return importFieldNamesHeader; + return ([importFieldNamesHeaderSwitch state] == NSOnState)?YES:NO; } #pragma mark - @@ -279,7 +281,9 @@ for(i=possibleImports; i>=0; i--) [fieldMappingArray replaceObjectAtIndex:possibleImports-i withObject:[NSNumber numberWithInteger:i]]; break; - + case 2: // try to align header and table target field names via Levenshtein distance + [self matchHeaderNames]; + break; } [fieldMapperTableView reloadData]; } @@ -304,6 +308,46 @@ [rowUpButton setEnabled:(fieldMappingCurrentRow != ([fieldMappingImportArray count]-1))]; } +- (IBAction)changeHasHeaderCheckbox:(id)sender +{ + [matchingNameMenuItem setEnabled:([importFieldNamesHeaderSwitch state] == NSOnState)?YES:NO]; +} + +- (IBAction)addGlobalSourceVariable:(id)sender +{ + +} + +#pragma mark - +#pragma mark Others + +- (void)matchHeaderNames +{ + if(![fieldMappingImportArray count]) return; + + NSMutableArray *fileHeaderNames = [NSMutableArray array]; + [fileHeaderNames setArray:NSArrayObjectAtIndex(fieldMappingImportArray, 0)]; + NSMutableArray *tableHeaderNames = [NSMutableArray array]; + [tableHeaderNames setArray:fieldMappingTableColumnNames]; + + NSInteger i,j; + NSMutableArray *matchedHeaderNames = [NSMutableArray array]; + for(i=0; i < [tableHeaderNames count]; i++) { + CGFloat minDist = 1e6; + NSInteger minIndex = 0; + for(j=0; j < [fileHeaderNames count]; j++) { + NSString *headerName = [NSArrayObjectAtIndex(fileHeaderNames,j) lowercaseString]; + CGFloat dist = [[NSArrayObjectAtIndex(tableHeaderNames,i) lowercaseString] levenshteinDistanceWithWord:headerName]; + if(dist < minDist && ![matchedHeaderNames containsObject:headerName]) { + minDist = dist; + minIndex = j; + } + if(dist == 0.0f) [matchedHeaderNames addObject:headerName]; + } + [fieldMappingArray replaceObjectAtIndex:i withObject:[NSNumber numberWithInteger:minIndex]]; + } +} + /* * Sets up the fieldMapping array to be shown in the tableView */ -- cgit v1.2.3