C # - Дубликат Изменения - PullRequest
3 голосов
/ 19 июля 2011

У меня есть файл, который выглядит следующим образом:

R.D.    P.N.      X       Y        Rot  Pkg
L5      120910    64.770  98.425   180  SOP8                    
P4      120911   -69.850  98.425   180  SOIC12                    
L10     120911   -19.685  83.820   180  SOIC10                    
P4      120911    25.400  83.820   180  0603                    
L5      120910    62.484  98.425   180  SOP8
L5      120910    99.100  150.105  180  SOP8
..      ......    ......  ......   ..   .......

Я хотел бы использовать string.Split(), чтобы разбить каждую строку, а затем проверить первое значение "string [0]" на каждомлиния.Если есть дубликаты одной и той же строки [0], я хотел бы добавить увеличенный «- #» в конец строки [0].Так что это будет что-то вроде string[0] + "-i" .....

. Под этим я подразумеваю, что для L5 в .txt выше они будут изменены на L5-1, L5-2 L5-3.То же самое относится к P4 (то есть P4-1, P4-2) ....


Таким образом, новый .txt будет выглядеть так:

R.D.      P.N.      X       Y        Rot  Pkg
L5-1      120910    64.770  98.425   180  SOP8                    
P4-1      120911   -69.850  98.425   180  SOIC12                    
L10       120911   -19.685  83.820   180  SOIC10                    
P4-2      120911    25.400  83.820   180  0603                    
L5-2      120910    62.484  98.425   180  SOP8
L5-3      120910    99.100  150.105  180  SOP8
..      ......    ......  ......   ..   .......

ВОПРОСЫ:

  • Как мне поступить таким образом?
  • Любая помощь в понимании каксделать это?

Ответы [ 4 ]

5 голосов
/ 19 июля 2011

Если у вас все в порядке с -1 для всех значений, которые содержат только одно вхождение, вот пример программы.Вам нужно будет сделать копию в конце, так как вы не можете удалить исходный файл во время записи нового.

// Replace c:\temp\temp.txt with you original file.
// Replace c:\temp\temp2.txt with your temporary new file.

using (var r = new StreamReader(@"c:\temp\temp.txt"))
{
    using (var w = new StreamWriter(@"c:\temp\temp2.txt"))
    {
        string line;
        var counter = new Dictionary<string, int>();

        // write header first, no changes necessary
        if ((line = r.ReadLine()) != null)
        {
            w.WriteLine(line);
        }

        while ((line = r.ReadLine()) != null)
        {

            // assuming it is safe to split on a space
            var values = line.Split(' ');

            // if the value hasn't been encountered before, add it
            if (!counter.ContainsKey(values[0]))
            {
                // start counter at 0
                counter.Add(values[0], 0);
            }

            // increment the count as we hit each occurrence of the
            // given key
            counter[values[0]] = counter[values[0]] + 1;

            // write out the original line, replacing the key with the
            // format key-#
            w.WriteLine(line.Replace(values[0], 
                                     string.Format("{0}-{1}", 
                                                   values[0], 
                                                   counter[values[0]])));
        }
    }
}

Пример ввода:

R.D.    P.N.      X       Y        Rot  Pkg
L5      120910    64.770  98.425   180  SOP8                    
P4      120911   -69.850  98.425   180  SOIC12                    
L10     120911   -19.685  83.820   180  SOIC10                    
P4      120911    25.400  83.820   180  0603                    
L5      120910    62.484  98.425   180  SOP8
L5      120910    99.100  150.105  180  SOP8

Пример вывода(проверено):

R.D.    P.N.      X       Y        Rot  Pkg
L5-1    120910    64.770  98.425   180  SOP8                    
P4-1    120911   -69.850  98.425   180  SOIC12                    
L10-1   120911   -19.685  83.820   180  SOIC10                    
P4-2    120911    25.400  83.820   180  0603                    
L5-2    120910    62.484  98.425   180  SOP8
L5-3    120910    99.100  150.105  180  SOP8

Если вы не хотите -1, вы всегда можете выполнить проверку перед записью, чтобы убедиться, что счетчик> 1.

2 голосов
/ 19 июля 2011

Как бы я это сделал:

  1. Открыть файл для чтения, открыть другой файл для записи.
  2. Чтение заголовка из исходного файла, запись в новый файл.
  3. Создать пустую строку в словаре int.
  4. Начать цикл:
  5. Чтение строки, выделение имени.
  6. Если имя не существует в словаре, добавьте его в словарь в качестве ключа с целочисленным значением 1.
  7. Добавьте имя + словарное значение для данного имени (например, имя - «L5», целое число - 3, поэтому добавьте «L5-3») и остальное содержимое строки (сохраненное на шаге 5) в новый файл.
  8. Увеличить значение словаря для данного имени.
  9. Повторите с шага 4.
  10. Удалить старый файл, изменить имя нового файла в соответствии с предыдущим файлом.

Редактировать для словаря, например:

//Create an empty dictionary
Dictionary<string, int> dictionary = new Dictionary<string, int>();

//Add a key/value pair
dictionary.Add("L5", 1);

//Check if the value exists, if not then add it
if( !dictionary.ContainsKey("L9") )
    dictionary.Add("L9", 1);

//Get the value (after making sure the value exists)
int value = dictionary["L5"];

//Increment the value
dictionary["L5"] = value + 1;

Синтаксис dictionary[string] следует использовать только в том случае, если вы знаете, что словарь уже содержит этот ключ, в противном случае вы рискуете получить ошибку. Другой способ сделать это - использовать метод TryGetValue:

int value;
if( dictionary.TryGetValue("L5", out value) )
{
    //Key exists already
    Console.WriteLine("L5 has a value of {0}", value);
}
else
{
    //Key does not exist
    dictionary.Add("L5", 1);
}
1 голос
/ 19 июля 2011

Как насчет этого:

 string[] input = {"R.D.    P.N.      X       Y        Rot  Pkg",
"L5 120910    64.770  98.425   180  SOP8",
"P4      120911   -69.850  98.425   180  SOIC12",
"L10     120911   -19.685  83.820   180  SOIC10",
"P4      120911    25.400  83.820   180  0603",
"L5      120910    62.484  98.425   180  SOP8",
"L5      120910    99.100  150.105  180  SOP8"};

    var control = new Dictionary<string, int>();
    var result = new List<string[]>();

    foreach (var line in input)
    {
       var array = line.Split(' ');
       result.Add(array);
       int occurencies = 0;
       ;
       control[array[0]] = control.TryGetValue(array[0], out occurencies) 
                           ? occurencies == 1 ? -2 : occurencies - 1
                           : 1;
    }

    foreach (var item in result.AsEnumerable().Reverse())
    {
       int value = control[item[0]];
       if (value < 0)
       {
          control[item[0]] = value + 1;
          item[0] = item[0] + value;     
       }
    }

Это даст вам результат, который вы после.Могут быть более эффективные способы, но для 800 строк этого должно быть достаточно.

0 голосов
/ 19 июля 2011

800 строк довольно крошечные.

  1. Просмотрите массив и добавьте первый столбец в словарь.Перед добавлением в словарь теста проверьте, есть ли в нем значение apperas.Если это так, просто увеличьте счетчик.

  2. Просмотрите свой словарь.Для каждого ключа, значение которого больше 1, циклически изменяйте массив и добавляйте «-1», «-2» и т. Д. Ко всем вхождениям ключа...

Не очень эффективно, но довольно просто реализовать

...