¿Cómo puedo formatear una columna de un archivo separado de la pestaña?

Nuevo a C# y Linq. He intentado buscar, y parece que no puedo ir a ninguna parte.

Estoy tratando de formatear la última columna en el archivo. Es un valor monetario y quiero formatearlo para mostrar 2 lugares decimales.

Esta función está dividiendo los datos y clasificando los archivos. Creo que el formato debe suceder cuando se pone el archivo juntos pero no estoy seguro de cómo implementar esto.

static void SortData(string directory, string outputDirectory)
{
    var d = new DirectoryInfo(directory);
    Console.WriteLine("Sorting Files...");

    foreach (FileInfo fi in d.GetFiles())
    {
        // Read file
        var fileContents = File.ReadAllText(directory+ fi.Name);

        //split on carriage returns and line feeds, remove empty entries.
        var lines = fileContents.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

        //Split each line on Tab
        var splitLines = lines.Select(l => l.Split(new[] { '\t' }));

        //splitLines is now an array of arrays.  Each splitLine entry is a line, and each entry of each splitline element is
        //a single field... so we should be able to sort how we want, e.g. by first field then by second field:
        var sortedLines = splitLines.OrderBy(sl => sl[0]).ThenBy(sl => sl[1]).ThenBy(sl => sl[2]).ThenBy(sl => sl[3]).ThenBy(sl => sl[4]).ThenBy(sl => sl[5]).ThenBy(sl => sl[6]);

        //put back together as TSV - put tabs back.
        var linesWithTabsAgain = sortedLines.Select(sl => string.Join("\t", sl));

        //put carriage returns/linefeeds back
        var linesWithCRLF = string.Join("\r\n", linesWithTabsAgain);

        File.WriteAllText(outputDirectory + fi.Name, linesWithCRLF);
    }

    Console.WriteLine("Sorting Complete");
}

Pregunta hecha hace 3 años, 4 meses, 29 días - Por pythonpirate


3 Respuestas:

  • Así que lo que necesita hacer es que después de dividir sus datos, para cada o las líneas, pare el valor de cadena en el número y luego formatee de nuevo en cadena pero con 2 dígitos. Ponga la siguiente línea después var sortedLines = splitLines.....:

    foreach(var sl in sortedLines)
    {
        sl[6]=decimal.Parse(sl[6]).ToString("F2");
    }
    

    Respondida el Dec 18, 2020 a las 03:17 - por scriptsculptor

    Votos positivos: 0 | Votos negativos: 0

  • Para formatear la última columna en el archivo con 2 lugares decimales, puedes modificar el código de la siguiente manera:

    csharp
    static void SortData(string directory, string outputDirectory)
    {
        var d = new DirectoryInfo(directory);
        Console.WriteLine("Sorting Files...");
    
        foreach (FileInfo fi in d.GetFiles())
        {
            // Read file
            var fileContents = File.ReadAllText(directory + fi.Name);
    
            //split on carriage returns and line feeds, remove empty entries.
            var lines = fileContents.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
    
            //Split each line on Tab
            var splitLines = lines.Select(l => l.Split(new[] { '\t' }));
    
            // Format the last column to display two decimal places
            var formattedLines = splitLines.Select(sl =>
            {
                sl[sl.Length - 1] = decimal.Parse(sl[sl.Length - 1]).ToString("0.00");
                return sl;
            });
    
            //splitLines is now an array of arrays.  Each splitLine entry is a line, and each entry of each splitline element is
            //a single field... so we should be able to sort how we want, e.g. by first field then by second field:
            var sortedLines = formattedLines.OrderBy(sl => sl[0]).ThenBy(sl => sl[1]).ThenBy(sl => sl[2]).ThenBy(sl => sl[3]).ThenBy(sl => sl[4]).ThenBy(sl => sl[5]).ThenBy(sl => sl[6]);
    
            //put back together as TSV - put tabs back.
            var linesWithTabsAgain = sortedLines.Select(sl => string.Join("\t", sl));
    
            //put carriage returns/linefeeds back
            var linesWithCRLF = string.Join("\r\n", linesWithTabsAgain);
    
            File.WriteAllText(Path.Combine(outputDirectory, fi.Name), linesWithCRLF);
        }
    
        Console.WriteLine("Sorting Complete");
    }
    

    En el código modificado, he agregado la parte donde se formatea la última columna del archivo a dos lugares decimales antes de la ordenación de las líneas. Dentro del Select de formattedLines, se convierte el valor de la última columna a un número decimal, se le da formato con dos lugares decimales y se reemplaza en la línea correspondiente. Esto se hace antes de ordenar las líneas según los criterios actuales.

    Recuerda ajustar la lógica de formateo si es necesario, dependiendo de cómo está estructurado el archivo y el tipo de datos que contiene. ¡Espero que esto te ayude a lograr el resultado que buscas!

    Respondida el Dec 19, 2020 a las 03:16 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para formatear la última columna en el archivo separado por tabuladores para mostrar 2 lugares decimales, puedes modificar la línea var linesWithTabsAgain de la siguiente manera:

    csharp
    var linesWithTabsAgain = sortedLines.Select(sl => string.Join("\t", sl[0], sl[1], sl[2], sl[3], sl[4], sl[5], sl[6], string.Format("{0:0.00}", decimal.Parse(sl[7]))));
    

    Esto reemplazará la última columna (sl[7]) con su valor formateado con 2 lugares decimales utilizando el método string.Format.

    Respondida el Dec 19, 2020 a las 03:21 - por Gemini

    Votos positivos: 0 | Votos negativos: 0