我有一个包含各种数据的大约3k个CSV文件的目录,我需要在某些时候将这些文件整理成一个文件,但首先我需要删除每个文件中的所有标题行。
通常为此我会整理文件,然后只需在Excel中打开,并在删除它们之前过滤到标题行。不幸的是,这些总和大约9M行,而Excel不喜欢这样......
有人可以想办法解决这个问题吗?最好是某种批处理脚本,它将运行目录中的所有文件。
提前致谢,
一个。
答案 0 :(得分:1)
以下假设每个文件的第一行是要删除的标题行。
只有当所有文件都不包含<TAB>
字符且没有任何文件太大时,它才能正常工作。我不记得具体细节,但是在某些时候,如果输入文件太大,那么带有重定向输出的MORE会挂起等待按键。
(for %F in (*.csv) do @more +1 "%F") >concat_csv.txt
我确保为输出文件提供不同的扩展名,以便命令不会尝试处理输出!另一种方法是将输出重定向到CSV文件,但位于不同的文件夹中。
如果要在批处理文件中使用此功能,请将百分比加倍(%F
变为%%F
)
答案 1 :(得分:0)
我不确定这是你在找什么......这是摆脱C#中重复标题的一种方法。代码的主要目的是存储一个标头string header
并通过跳过第一行(while (rdr.Peek() != -1)
)来读取文件。
我还使用字典来存储每个csv文件的行。这将防止包含不同csv文件中的重复行(我不确定此函数在您的情况下是否有用)。
想象一下fname
是一个字符串数组,其中包含您要合并的文件。
Dictionary<string, string> dict = new Dictionary<string, string>();
string destinationFile = <write path of your destination file>;
string dir = <write path of your original directory>
string header = "";
if (dir.Length != 0)
{
foreach (string f in fnames)
{
using (StreamReader rdr = new StreamReader(dir + "\\" + f))
{
header = rdr.ReadLine();
while (rdr.Peek() != -1)
{
string ln = rdr.ReadLine();
string[] split_ln = ln.Split(',');
string value = (split_ln.Length != 2) ? string.Join(",", split_ln.Skip(1)) : split_ln[1];
dict.Add(split_ln[0], value);
}
}
}
using (StreamWriter wr = new StreamWriter(destinationFile))
{
wr.WriteLine(header);
foreach (var pair in dict)
{
wr.WriteLine("{0},{1}", Convert.ToString(pair.Key), pair.Value);
}
}
}