С# удаление последнего поля с разделителями из разделения строки

Я начинающий программист на С#, и у меня только что был быстрый вопрос о приложении, которое я создаю. Мой процесс считывает несколько файлов с целью удаления определенных записей на основе поля с разделителями 1 или 0 в текстовом файле. На самом деле это последнее поле с разделителями в файле. Если это 0, я записываю его во временный файл (который позже заменит исходный, который я читал), если это что-то еще, я этого не делаю. И не хочу слишком запутывать, но в файле есть два типа записей: строка заголовка, за которой следуют несколько вспомогательных строк. Строка заголовка — единственная, у которой есть флаг, поэтому, как вы можете видеть снизу, если логическое значение установлено в хорошую запись, равное 0, оно записывает запись заголовка вместе со всеми вспомогательными записями под ней, пока не достигнет плохой один, и в этом случае он отменит их запись до следующего хорошего.

Однако то, что я пытаюсь сделать сейчас (и хотел бы узнать самый простой способ), - это как написать запись заголовка без поля с разделителями последней трубы (IE флаг). Поскольку это всегда должны быть последние 2 символа строки (например, «0|» или «1|», так как требуется предшествующая вертикальная черта), должна ли она быть обрезкой строки в моей строке inputrecord? Есть ли более простой способ? Есть ли способ разделить запись, но не включать последнее поле (в данном случае поле 36)? Любой совет будет принят во внимание. Спасибо,

static void Main(string[] args)
{
    try
    {
        string executionDirectory = RemoveFlaggedRecords.Properties.Settings.Default.executionDirectory;
        string workDirectory = RemoveFlaggedRecords.Properties.Settings.Default.workingDirectory;

        string[] files = Directory.GetFiles(executionDirectory, "FilePrefix*");             
        foreach (string file in files)
        {
            string tempFile = Path.Combine(workDirectory,Path.GetFileName(file));
            using (StreamReader sr = new StreamReader(file,Encoding.Default))
            {
                StreamWriter sw = new StreamWriter(tempFile);
                string inputRecord = sr.ReadLine();

                bool goodRecord = false;
                bool isheaderRecord = false;
                while (inputRecord != null)
                {
                    string[] fields = inputRecord.Split('|');
                    if (fields[0].ToString().ToUpper() == "HEADER")
                    {                               
                        goodRecord = Convert.ToInt32(fields[36]) == 0;
                        isheaderRecord = true;
                    }

                    if (goodRecord == true && isheaderRecord == true)
                    {       
                        //    I'm not sure what to do here to write the string without the 36th field***
                    }
                    else if (goodRecord == true)
                    {
                        sw.WriteLine(inputRecord);
                    }

                    inputRecord = sr.ReadLine();
                }

                sr.Close();
                sw.Close();
                sw = null;
            }    
        }

        string[] newFiles = Directory.GetFiles(workDirectory, "fileprefix*");
        foreach (string file in newFiles)
        {
            string tempFile = Path.Combine(workDirectory, Path.GetFileName(file));
            string destFile = Path.Combine(executionDirectory, Path.GetFileName(file));

            File.Copy(tempFile, destFile, true);
            if (File.Exists(destFile))
            {
                File.Delete(tempFile);
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }

    finally
    {
        // not done   
    }
}

person user3494110    schedule 14.11.2014    source источник
comment
Вы можете разделить, использовать ссылку Take(count), чтобы взять все поля, кроме последнего, а затем снова присоединиться к ним, чтобы записать...   -  person Jason Goemaat    schedule 14.11.2014


Ответы (2)


Один из способов сделать это - если вы хотите в этот момент кода всегда писать все, кроме последнего элемента в вашем string[], - это построить цикл for, который завершается перед последним элементом:

for (int i = 0; i < fields.Length - 1; i++)
{
     // write your field here
}

Это предполагает, что вы хотите написать каждое поле отдельно и что вы хотите перебирать fields в первую очередь. Если все, что вы хотите сделать, это просто написать одну строку в одну строку без использования цикла, вы можете сделать это:

var truncatedFields = fields.Take(fields.Length - 1);

А потом просто напишите truncatedFields string[] как считаете нужным. Один из способов выполнить все это в одной строке может выглядеть так:

sw.WriteLine(String.Join("|", fields.Take(fields.Length - 1)));
person furkle    schedule 14.11.2014
comment
string.Join принимает разделитель в качестве первого параметра и набор строк в качестве второго. - person juharr; 14.11.2014
comment
Также разделителем должна быть строка. - person juharr; 14.11.2014
comment
@user3494110 user3494110 Если это решило вашу проблему, не забудьте проголосовать и выбрать ответ. - person furkle; 14.11.2014

goodRecord = fields.Last().Trim() == "0";

if (inputRecord.Contains("|") string outputRecord = inputRecord.Substring(1, inputRecord.LastIndexOf("|"));

person Qiang    schedule 14.11.2014