C# 查找csv文件中每列的最大长度
因此,我试图在控制台应用程序中呈现csv文档。但是,由于其中的文本大小不同,因此输出的格式不可呈现 为了演示它,我尝试计算每列文本的最大长度,然后在该列的剩余文本中添加空格,以便每列中的字符长度相等 我试着计算角色数,但似乎不知道如何继续下去C# 查找csv文件中每列的最大长度,c#,asp.net,.net,linq,C#,Asp.net,.net,Linq,因此,我试图在控制台应用程序中呈现csv文档。但是,由于其中的文本大小不同,因此输出的格式不可呈现 为了演示它,我尝试计算每列文本的最大长度,然后在该列的剩余文本中添加空格,以便每列中的字符长度相等 我试着计算角色数,但似乎不知道如何继续下去 var file = File.ReadAllLines(@"E:\File.csv"); var lineList = file.Select(x => x.Split(',').ToList()).ToList(); int maxColumn
var file = File.ReadAllLines(@"E:\File.csv");
var lineList = file.Select(x => x.Split(',').ToList()).ToList();
int maxColumn = lineList.Select(x => x.Count).Max(x => x);
List<int> maxElementSize = new List<int>();
for (int i = 0; i < maxColumn; i++)
{
//Some Logic
}
var file=file.ReadAllLines(@“E:\file.csv”);
var lineList=file.Select(x=>x.Split(',').ToList()).ToList();
int maxColumn=lineList.Select(x=>x.Count).Max(x=>x);
List maxElementSize=新列表();
对于(int i=0;i
任何帮助都将不胜感激。初始化您的列表,然后在您的行上循环,并在该行内循环您的列:
for (i = 0; i < lineList.Count; i++)
{
maxElementSize[i] = 0;
}
for (i = 0; i < lineList.Count; i++)
{
for (j = 0; j < maxColumn; j++)
{
if(lineList[i][j].Length > maxElementSize[j])
maxElementSize[j] = lineList[i][j].Length
}
}
for(i=0;imaxElementSize[j])
maxElementSize[j]=lineList[i][j]。长度
}
}
下面是一个示例控制台应用程序,用于获取每列的最大字符长度:
static void Main(string[] args)
{
string CSVPath = @"D:\test.csv";
string outputText = "";
using (var reader = File.OpenText(CSVPath))
{
outputText = reader.ReadToEnd();
}
var colSplitter = ',';
var rowSplitter = new char[] { '\n' };
var rows = (from row in outputText.Split(rowSplitter, StringSplitOptions.RemoveEmptyEntries)
let cols = row.Split(colSplitter)
from col in cols
select new { totalCols = cols.Count(), cols = cols }).ToList();
int[] maxColLengths = new int[rows.Max(o => o.totalCols)];
for (int i = 0; i < rows.Count; i++)
{
for (int j = 0; j < rows[i].cols.Count(); j++)
{
int curLength = rows[i].cols[j].Trim().Length;
if (curLength > maxColLengths[j])
maxColLengths[j] = curLength;
}
}
Console.WriteLine(string.Join(", ", maxColLengths));
}
static void Main(字符串[]args)
{
字符串CSVPath=@“D:\test.csv”;
字符串outputText=“”;
使用(var reader=File.OpenText(CSVPath))
{
outputText=reader.ReadToEnd();
}
var colSplitter=',';
var rowSplitter=新字符[]{'\n'};
var rows=(来自outputText.Split中的行(rowSplitter、StringSplitOptions.RemoveEmptyEntries)
设cols=row.Split(colSplitter)
从col到cols
选择新的{totalCols=cols.Count(),cols=cols}).ToList();
int[]maxcollength=newint[rows.Max(o=>o.totalCols)];
for(int i=0;i最大卷曲长度[j])
最大长度[j]=卷曲长度;
}
}
Console.WriteLine(string.Join(“,”,maxColleLength));
}
希望这有帮助。尝试使用嵌套for循环:
var inputLines = File.ReadAllLines(@"E:\File.csv");
Dictionary<int,int> dictIndexLenght = new Dictionary<int,int>();
foreach(var line in inputLines)
{
List<string> columList = line.Split(',').ToList();
for (int i = 0; i < columList.Count; i++)
{
int tempVal = 0;
if(dictIndexLenght.TryGetValue(i,out tempVal))
{
if(tempVal<columList[i].Length)
{
dictIndexLenght[i]=columList[i].Length;
}
}
else
dictIndexLenght[i]=columList[i].Length;
}
}
var inputLines=File.ReadAllLines(@“E:\File.csv”);
Dictionary Dictionary IndexLenght=新字典();
foreach(输入行中的var行)
{
List columnlist=line.Split(',').ToList();
for(int i=0;i if(tempVal我会这样做,非常类似于un lucky的答案,只使用列表而不是字典。我添加了虚拟数据进行测试,但您可以看到读取文件的实际调用留在那里,因此您可以删除虚拟数据和读取它的行,它应该可以正常工作:
static void Main(string[] args)
{
var fileLines = new List<string>
{
"Lorem, Ipsum, is, simply, dummy, text, of, the, printing, and, typesetting,",
"industry., Lorem, Ipsum, has, been, the, industry's, standard, dummy, text,",
"ever, since, the, 1500s, when, an, ",
"unknown, printer, took, a, galley, of, type, and, scrambled, it, to, make,",
"a, type, specimen, book.,",
"It, has, survived, not, only, five, centuries, but, also, the, leap,",
"into, electronic, typesetting, remaining, essentially, unchanged.,",
"It, was, popularised, in, the, 1960s, with, the, release,",
"of, Letraset, sheets, containing, Lorem, Ipsum, passages, and, more, ",
"recently, with, desktop, publishing,",
"software, like, Aldus, PageMaker, including, versions, of, Lorem, Ipsum."
};
var filePath = @"f:\public\temp\temp.csv";
var fileLinesColumns = File.ReadAllLines(filePath).Select(line => line.Split(','));
var colWidths = new List<int>();
// Remove this line to use file data
fileLinesColumns = fileLines.Select(line => line.Split(','));
// Get the max length of each column and add it to our list
foreach (var fileLineColumns in fileLinesColumns)
{
for (int i = 0; i < fileLineColumns.Length; i++)
{
if (i > colWidths.Count - 1)
{
colWidths.Add(fileLineColumns[i].Length);
}
else if (fileLineColumns[i].Length > colWidths[i])
{
colWidths[i] = fileLineColumns[i].Length;
}
}
}
// Write out our columns, padding each one to match the longest line
foreach (var fileLineColumns in fileLinesColumns)
{
for (int i = 0; i < fileLineColumns.Length; i++)
{
Console.Write(fileLineColumns[i].PadRight(colWidths[i]));
}
Console.WriteLine();
}
Console.Write("\nDone!\nPress any key to exit...");
Console.ReadKey();
}
static void Main(字符串[]args)
{
var fileLines=新列表
{
“Lorem,Ipsum,简单地说就是虚拟、文本、of、the、打印和排版,”,
“行业、知识产权、Ipsum、过去、过去、行业、标准、虚拟、文本,”,
“从,从,到,16世纪,当,”,
“未知,打印机,带,a,厨房,of,type,and,scramed,it,to,make,”,
“a、类型、样本、书籍”,
“它不仅经历了五个世纪,而且还经历了一次飞跃,”,
“输入、电子、排版、保留、基本不变。”,
“它,是,在,1960年代,随着,发行,”,
“of,Letraset,sheets,containing,Lorem,Ipsum,passions,and,more,”,
“最近,随着,桌面,出版,”,
“软件,如Aldus、PageMaker,包括、版本、Lorem、Ipsum。”
};
var filePath=@“f:\public\temp\temp.csv”;
var fileLinesColumns=File.ReadAllLines(filePath);
var colWidths=新列表();
//删除此行以使用文件数据
fileLinesColumns=fileLines.Select(line=>line.Split(',');
//获取每列的最大长度并将其添加到列表中
foreach(fileLinesColumns中的var fileLineColumns)
{
对于(int i=0;icolWidths.Count-1)
{
添加(fileLineColumns[i].Length);
}
else if(fileLineColumns[i].Length>coldwiths[i])
{
colWidths[i]=fileLineColumns[i]。长度;
}
}
}
//写出我们的专栏,将每一行填入最长的一行
foreach(fileLinesColumns中的var fileLineColumns)
{
对于(int i=0;i
输出
将CSV拆分为,“
有些幼稚,因为值可能是一个包含逗号的带引号的字符串。如果您不想以后浪费时间,请使用现有的经验证的库来解析CSV。如果a列最多12个字符,B列最多14个字符,是否希望a列填充为12个字符,B列填充为14?@spender您是否有任何现有的库可以帮助我实现这一点?@mjwills这基本上就是我想要实现的。每列的最大列长度。我听说了一些好消息,您可能希望添加一个检查,检查行的长度是否超过j
,以避免出现带有锯齿a的IndexOutOfRangeException
rrays。在开始时为每一行(而不是每一列)设置maxElementSize[i]
似乎很奇怪。@mjwills我没有这样做。仅仅因为我使用了一个变量名,这并不意味着i
意味着行…maxElementSize是一个di
static void Main(string[] args)
{
var fileLines = new List<string>
{
"Lorem, Ipsum, is, simply, dummy, text, of, the, printing, and, typesetting,",
"industry., Lorem, Ipsum, has, been, the, industry's, standard, dummy, text,",
"ever, since, the, 1500s, when, an, ",
"unknown, printer, took, a, galley, of, type, and, scrambled, it, to, make,",
"a, type, specimen, book.,",
"It, has, survived, not, only, five, centuries, but, also, the, leap,",
"into, electronic, typesetting, remaining, essentially, unchanged.,",
"It, was, popularised, in, the, 1960s, with, the, release,",
"of, Letraset, sheets, containing, Lorem, Ipsum, passages, and, more, ",
"recently, with, desktop, publishing,",
"software, like, Aldus, PageMaker, including, versions, of, Lorem, Ipsum."
};
var filePath = @"f:\public\temp\temp.csv";
var fileLinesColumns = File.ReadAllLines(filePath).Select(line => line.Split(','));
var colWidths = new List<int>();
// Remove this line to use file data
fileLinesColumns = fileLines.Select(line => line.Split(','));
// Get the max length of each column and add it to our list
foreach (var fileLineColumns in fileLinesColumns)
{
for (int i = 0; i < fileLineColumns.Length; i++)
{
if (i > colWidths.Count - 1)
{
colWidths.Add(fileLineColumns[i].Length);
}
else if (fileLineColumns[i].Length > colWidths[i])
{
colWidths[i] = fileLineColumns[i].Length;
}
}
}
// Write out our columns, padding each one to match the longest line
foreach (var fileLineColumns in fileLinesColumns)
{
for (int i = 0; i < fileLineColumns.Length; i++)
{
Console.Write(fileLineColumns[i].PadRight(colWidths[i]));
}
Console.WriteLine();
}
Console.Write("\nDone!\nPress any key to exit...");
Console.ReadKey();
}