私は次のシナリオを実装するための最も効率的な方法を見つけようとしています:
私はこのようなリストを持っています:
public static IEnumerable<string> ValidTags = new List<string> {
"ABC.XYZ",
"PQR.SUB.UID",
"PQR.ALI.OBD",
};
複数の列を持つ巨大なCSVがあります。列の1つはtags
です。この列には、空白の値、または上記の値のいずれかが含まれています。問題は、タグ列に「ABC.XYZ?@
」のような値が含まれている可能性があることです。つまり、有効なタグといくつかの無関係な文字が含まれている可能性があります。このような列は、有効なタグの1つと「厳密に一致する」ため、有効なタグで更新する必要があります。
例:
PQR.ALI.OBD?
、有効なタグで更新してくださいPQR.ALI.OBD
PQR.ALI.OBA
、これは無効PQR.ALI.OBA-invalid
です。無効なサフィックスを追加して更新してください。私はこれを行うための最良の方法を見つけようとしています。
私の現在のアプローチは次のとおりです。
これを行うためのより良い/より効率的な方法はありますか?
更新:
リストには5つのアイテムしかありませんが、ここでは3つを示しました。余分な文字は最後にあります。これは、人々がExcel WebバージョンでそれらのCSVを編集していて、一部のエントリを台無しにしているために発生しています。
私の現在のコード:(これを行うためのより良い方法があると確信しています。C#でも新しいので、これを改善する方法を教えてください)。CSVHelperを使用してCSVセルを取得しています。
var record = csv.GetRecord<Record>();
string tag = csv.GetField(10); //tag column number in CSV is 10
/* Criteria for validation:
* tag matches our list, but has extraneous chars - strip extraneous chars and update csv
* tag doesn't match our list - add suffix invalid.*/
int listIndex = 0;
bool valid;
foreach (var validTags in ValidTags) //ValidTags is the enum above
{
if (validTags.Contains(tag.ToUpper()) && !string.Equals(validTags, subjectIdentifier.ToUpper()))
{
valid = true;
continue; //move on to next csv row.
//this means that tag is valid but has some extra characters appended to it because of web excel, strip extra charts
}
listIndex++;
if(listIndex == 3 && !valid) {
//means we have reached the end of the list but not found valid tag
//add suffix invalid and move on to next csv row
}
}
余分な文字は最後にあると言い、元のタグが余分な文字の前にまだ存在していると仮定すると、各タグのリストを検索して、タグにリストのエントリが含まれているかどうかを確認できます。一致する場合は、完全に一致しない場合は正しいエントリに更新し、一致しない場合は、「-invalid」タグを追加します。
これを行う前に、最初にリストを降順で並べ替えて、検索時に最も近い(最長の)一致を見つける必要がある場合があります(リスト内の1つのアイテムがリスト内の別のアイテムで始まる場合)。
var csvPath = @"f:\public\temp\temp.csv";
var entriesUpdated = 0;
// Order the list so we match on the most similar match (ABC.DEF before ABC)
var orderedTags = ValidTags.OrderByDescending(t => t);
var newFileLines = new List<string>();
// Read each line in the file
foreach (var csvLine in File.ReadLines(csvPath))
{
// Get the columns
var columns = csvLine.Split(',');
// Process each column
for (int index = 0; index < columns.Length; index++)
{
var column = columns[index];
switch (index)
{
case 0: // tag column
var correctTag = orderedTags.FirstOrDefault(tag =>
column.IndexOf(tag, StringComparison.OrdinalIgnoreCase) > -1);
if (correctTag != null)
{
// This item contains a correct tag, so
// update it if it's not an exact match
if (column != correctTag)
{
columns[index] = correctTag;
entriesUpdated++;
}
}
else
{
// This column does not contain a correct tag, so mark it as invalid
columns[index] += "-invalid";
entriesUpdated++;
}
break;
// Other cases for other columns follow if needed
}
}
newFileLines.Add(string.Join(",", columns));
}
// Write the new lines if any were changed
if (entriesUpdated > 0) File.WriteAllLines(csvPath, newFileLines);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加