// -------------------------------------------------------------------- // FormNicoKaraLister.ProgramOrigin() の CSV 版 // 番組 ID 検索アルゴリズムは CreateInfoDbProgramAliasTableInsert() と同様とする // -------------------------------------------------------------------- private String ProgramOriginCsv(String oProgram) { List <String> aProgramAliasRecord = NklCommon.FindCsvRecord(mProgramAliasCsvs, (Int32)ProgramAliasCsvColumns.Alias, oProgram); if (aProgramAliasRecord == null) { return(oProgram); } // 番組名が指定されたものとして番組 ID を検索 List <String> aProgramRecord; if (String.IsNullOrEmpty(aProgramAliasRecord[(Int32)ProgramAliasCsvColumns.ForceId])) { aProgramRecord = NklCommon.FindCsvRecord(mProgramCsvs, (Int32)ProgramCsvColumns.Name, aProgramAliasRecord[(Int32)ProgramAliasCsvColumns.NameOrId]); if (aProgramRecord != null) { return(aProgramRecord[(Int32)ProgramCsvColumns.Name]); } } // 番組 ID が指定されたものとして番組 ID を検索 aProgramRecord = NklCommon.FindCsvRecord(mProgramCsvs, (Int32)ProgramCsvColumns.Id, aProgramAliasRecord[(Int32)ProgramAliasCsvColumns.NameOrId]); if (aProgramRecord != null) { return(aProgramRecord[(Int32)ProgramCsvColumns.Name]); } return(oProgram); }
// -------------------------------------------------------------------- // FormNicoKaraLister.SongOrigin() の CSV 版 // 楽曲 ID 検索アルゴリズムは CreateInfoDbSongAliasTableInsert() と同様とする // -------------------------------------------------------------------- private String SongOriginCsv(String oTitle) { List <String> aSongAliasRecord = NklCommon.FindCsvRecord(mSongAliasCsvs, (Int32)SongAliasCsvColumns.Alias, oTitle); if (aSongAliasRecord == null) { return(oTitle); } // 楽曲名が指定されたものとして楽曲 ID を検索 List <String> aSongRecord; if (String.IsNullOrEmpty(aSongAliasRecord[(Int32)SongAliasCsvColumns.ForceId])) { aSongRecord = NklCommon.FindCsvRecord(mSongCsvs, (Int32)SongCsvColumns.Name, aSongAliasRecord[(Int32)SongAliasCsvColumns.NameOrId]); if (aSongRecord != null) { return(aSongRecord[(Int32)SongCsvColumns.Name]); } } // 楽曲 ID が指定されたものとして楽曲 ID を検索 aSongRecord = NklCommon.FindCsvRecord(mSongCsvs, (Int32)SongCsvColumns.Id, aSongAliasRecord[(Int32)SongAliasCsvColumns.NameOrId]); if (aSongRecord != null) { return(aSongRecord[(Int32)SongCsvColumns.Name]); } return(oTitle); }
// -------------------------------------------------------------------- // 楽曲情報・番組情報をインポート(1 ファイル分) // -------------------------------------------------------------------- private void ImportInfo <T>(Dictionary <String, List <List <String> > > oCsvs, String oCsvFileName, String oExtractedFolderPath, Int32 oKeyColumnIndex, ref Int32 oTotalAddedRecords) { // 解凍された CSV ファイルがあるか確認 String aExtractedCsvPath = oExtractedFolderPath + oCsvFileName; if (!File.Exists(aExtractedCsvPath)) { return; } Int32 aNumAddedRecords = 0; List <String> aTitle = NklCommon.CsvTitle <T>(); // CSV 読み込み ShowLogMessage(Common.TRACE_EVENT_TYPE_STATUS, oCsvFileName + " をインポートしています..."); List <List <String> > aCsv = NklCommon.LoadCsv(aExtractedCsvPath, mNicoKaraListerSettings, aTitle.Count + 1); // インポート String aUserCsvPath = NklCommon.UserCsvPath(oCsvFileName); foreach (List <String> aRecord in aCsv) { // ユーザー CSV に既にキー列が存在している場合はインポートしない String aFoundCsvPath; List <String> aFoundRecord = NklCommon.FindCsvRecord(oCsvs, oKeyColumnIndex, aRecord[oKeyColumnIndex], out aFoundCsvPath); if (aFoundRecord != null && !NklCommon.IsSystemCsvPath(aFoundCsvPath)) { continue; } // システム CSV に既に同じレコードが存在している場合はインポートしない if (NklCommon.RecordExists(oCsvs, aRecord, oKeyColumnIndex)) { continue; } // インポートする if (!oCsvs.ContainsKey(aUserCsvPath)) { oCsvs[aUserCsvPath] = new List <List <String> >(); } oCsvs[aUserCsvPath].Add(aRecord); aNumAddedRecords++; } // 保存 if (aNumAddedRecords > 0) { NklCommon.BackupCsv(aUserCsvPath); CsvManager.SaveCsv(aUserCsvPath, oCsvs[aUserCsvPath], "\r\n", Encoding.UTF8, aTitle, true); } // 報告 ShowLogMessage(Common.TRACE_EVENT_TYPE_STATUS, "重複を除く " + aNumAddedRecords + " レコードをインポートしました。"); oTotalAddedRecords += aNumAddedRecords; }
// -------------------------------------------------------------------- // 編集する必要がありそうなファイルに飛ぶ // -------------------------------------------------------------------- private void JumpToNextCandidate(Object oDummy) { try { // 準備 DisableComponents(); SetCursor(Cursors.WaitCursor); // 初めての場合は CSV をロード if (mProgramCsvs == null) { NklCommon.LoadCsvs(mNicoKaraListerSettings, out mProgramCsvs, out mSongCsvs, out mProgramAliasCsvs, out mSongAliasCsvs); } Invoke(new Action(() => { Int32 aRowIndex = -1; if (DataGridViewPreview.SelectedRows.Count > 0) { aRowIndex = DataGridViewPreview.SelectedRows[0].Index; } // マッチ準備 FolderSettingsInDisk aFolderSettingsInDisk = NklCommon.LoadFolderSettings(mFolder); FolderSettingsInMemory aFolderSettingsInMemory = NklCommon.CreateFolderSettingsInMemory(aFolderSettingsInDisk); for (; ;) { aRowIndex++; if (aRowIndex >= DataGridViewPreview.RowCount) { ShowLogMessage(TraceEventType.Information, "ファイル名から取得した情報が楽曲情報・番組情報に未登録のファイルは見つかりませんでした。"); DataGridViewPreview.ClearSelection(); return; } // ファイル命名規則とフォルダー固定値を適用 Dictionary <String, String> aDic = NklCommon.MatchFileNameRulesAndFolderRule( Path.GetFileNameWithoutExtension((String)DataGridViewPreview.Rows[aRowIndex].Cells[(Int32)PreviewColumns.File].Value), aFolderSettingsInMemory); // 楽曲名が空かどうか if (String.IsNullOrEmpty(aDic[NklCommon.RULE_VAR_TITLE])) { break; } // 楽曲名が anison.info と不一致かどうか String aSongOrigin = SongOriginCsv(aDic[NklCommon.RULE_VAR_TITLE]); List <String> aSongCsvRecord = NklCommon.FindCsvRecord(mSongCsvs, (Int32)SongCsvColumns.Name, aSongOrigin); if (aSongCsvRecord == null) { break; } // 番組名がある場合、番組名が anison.info と不一致かどうか if (!String.IsNullOrEmpty(aDic[NklCommon.RULE_VAR_PROGRAM])) { String aProgramOrigin = ProgramOriginCsv(aDic[NklCommon.RULE_VAR_PROGRAM]); List <String> aProgramCsvRecord = NklCommon.FindCsvRecord(mProgramCsvs, (Int32)ProgramCsvColumns.Name, aProgramOrigin); if (aProgramCsvRecord == null) { break; } } } DataGridViewPreview.Rows[aRowIndex].Selected = true; // 検出行が完全に表示されていない場合はスクロールする Int32 aBeforeRowIndex = aRowIndex > 0 ? aRowIndex - 1 : aRowIndex; Int32 aAfterRowIndex = aRowIndex < DataGridViewPreview.RowCount - 1 ? aRowIndex + 1 : aRowIndex; if (!DataGridViewPreview.Rows[aBeforeRowIndex].Displayed || !DataGridViewPreview.Rows[aAfterRowIndex].Displayed) { DataGridViewPreview.FirstDisplayedScrollingRowIndex = aRowIndex; } })); } catch (OperationCanceledException) { ShowLogMessage(Common.TRACE_EVENT_TYPE_STATUS, "未登録検出を中止しました。"); } catch (Exception oExcep) { ShowLogMessage(TraceEventType.Error, "未登録検出時エラー:\n" + oExcep.Message); ShowLogMessage(TraceEventType.Verbose, " スタックトレース:\n" + oExcep.StackTrace); } finally { // 後片付け SetCursor(Cursors.Default); EnableComponents(); } }