¿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
deformattedLines
, 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