.net 连接纯文本文件的最佳方法?

.net 连接纯文本文件的最佳方法?,.net,windows,command-line,windows-console,.net,Windows,Command Line,Windows Console,我有一大堆纯文本文件,命名如下:file1.txt,file2.txt,…,file14.txt。。。 我想把它们按适当的顺序连接到一个.txt文件中。 我应该如何以编程方式执行此操作? 在命令窗口中运行的批处理文件? 还是编写Windows控制台应用程序 不管怎样,能给我密码吗?谢谢 更多信息: 大量的文件。我每次做这份报告都会有上百个 dir不会按正确的顺序给出文件:例如,file10.txt出现在file2.txt之前,这就是我强调的原因。似乎将从1到n的i连接到文件名前缀是最好的。但我

我有一大堆纯文本文件,命名如下:file1.txt,file2.txt,…,file14.txt。。。 我想把它们按适当的顺序连接到一个.txt文件中。 我应该如何以编程方式执行此操作? 在命令窗口中运行的批处理文件? 还是编写Windows控制台应用程序

不管怎样,能给我密码吗?谢谢

更多信息:

  • 大量的文件。我每次做这份报告都会有上百个

  • dir不会按正确的顺序给出文件:例如,file10.txt出现在file2.txt之前,这就是我强调的原因。似乎将从1到n的i连接到文件名前缀是最好的。但我不知道如何在批处理模式下执行,也不知道如何从Windows程序执行命令

我倾向于使用Windows控制台应用程序。像这样的东西行吗

class Program
{
    static void Main(string[] args)
    {
        string strCmdLine;
        System.Diagnostics.Process process1;
        process1 = new System.Diagnostics.Process();


        Int16 n = Convert.ToInt16(args[1]);
        int i;
        for (i = 1; i < n; i++)
        {
            strCmdLine = "/C copy more work here " + args[0] + i.ToString();
            System.Diagnostics.Process.Start("CMD.exe", strCmdLine);
            process1.Close();
        }


    }
}
类程序
{
静态void Main(字符串[]参数)
{
字符串strCmdLine;
系统诊断过程1;
process1=新的System.Diagnostics.Process();
Int16 n=Convert.ToInt16(args[1]);
int i;
对于(i=1;i
您有两种可能性。如果在命令行中执行一个
dir
,并且它们按照您想要的顺序显示,那么事情就相当简单了--您可以执行以下操作:

copy file*.txt destination.txt
这会有一些小的副作用——它会在遇到第一个
control-Z
时停止读取任何给定的文件,并在文件末尾附加一个
control-Z
。如果您不希望发生这种情况,可以添加一个
/b

copy /b file*.txt destination.txt
如果“目录”顺序不是您想要的顺序,则可以执行以下操作:

for %c in (a.txt b.txt c.txt) copy destination.txt+%c

其中,
a.txt
b.txt
c.txt
(等)是您要复制的文件,按您要复制的顺序列出(而且,很明显,
destination.txt
是你想要给结果起的名字,你把它们放在一起了。或者,你可以在一个命令行中列出它们,比如
copy a.txt+b.txt+c.txt destination.txt

你有两种可能。如果你在命令行中执行
dir
,它们就会消失。)按照你想要的顺序,事情很简单——你可以做如下事情:

copy file*.txt destination.txt
这会有一些小的副作用——它会在遇到第一个
control-Z
时停止读取任何给定的文件,并且会在文件末尾附加一个
control-Z
。如果不希望发生这些情况,可以添加一个
/b

copy /b file*.txt destination.txt
如果“目录”顺序不是您想要的顺序,则可以执行以下操作:

for %c in (a.txt b.txt c.txt) copy destination.txt+%c

其中,
a.txt
b.txt
c.txt
(等)是您要复制的文件,按您要复制的顺序列出(而且,很明显,
destination.txt
是你想要给结果起的名字,你把它们放在一起。或者,你可以在一个命令行中列出它们,比如
copy a.txt+b.txt+c.txt destination.txt

我记得有一个非常有用的程序:split&concat.for mac os x…不知道是否有其他操作系统版本…能起作用!

我记得有一个非常有用的程序:split&concat。对于mac os x…不知道是否有其他操作系统版本…能起作用!

不是最有效的代码,但你应该能够理解:

        Dim files As String()
    Dim tempFile As String
    Dim orderedFiles As New Dictionary(Of Int32, String)
    Dim fileNumber As Int32
    Dim filePos As Int32
    Dim dotTxtPos As Int32
    Dim fileData As String
    Const CONST_DEST_FILE As String = "c:\tempfiles\destination.txt"

    files = System.IO.Directory.GetFiles("c:\tempfiles", "file*.txt")

    For Each tempFile In files
        If tempFile.ToLower.Contains("\file") = False Or tempFile.ToLower.Contains(".txt") = False Then
            Continue For
        End If

        filePos = tempFile.ToLower.IndexOf("\file") + 5
        dotTxtPos = tempFile.ToLower.IndexOf(".txt", filePos)
        If Int32.TryParse(tempFile.ToLower.Substring(filePos, dotTxtPos - filePos), fileNumber) = True Then
            orderedFiles.Add(fileNumber, tempFile)
        End If
    Next

    If System.IO.File.Exists(CONST_DEST_FILE) = True Then
        System.IO.File.Delete(CONST_DEST_FILE)
    End If

    fileNumber = 0
    Do While orderedFiles.Count > 0
        fileNumber += 1
        If orderedFiles.ContainsKey(fileNumber) = True Then
            tempFile = orderedFiles(fileNumber)
            fileData = System.IO.File.ReadAllText(tempFile)
            System.IO.File.AppendAllText(CONST_DEST_FILE, fileData)
            orderedFiles.Remove(fileNumber)
        End If
    Loop

虽然不是最有效的代码,但您应该能够理解:

        Dim files As String()
    Dim tempFile As String
    Dim orderedFiles As New Dictionary(Of Int32, String)
    Dim fileNumber As Int32
    Dim filePos As Int32
    Dim dotTxtPos As Int32
    Dim fileData As String
    Const CONST_DEST_FILE As String = "c:\tempfiles\destination.txt"

    files = System.IO.Directory.GetFiles("c:\tempfiles", "file*.txt")

    For Each tempFile In files
        If tempFile.ToLower.Contains("\file") = False Or tempFile.ToLower.Contains(".txt") = False Then
            Continue For
        End If

        filePos = tempFile.ToLower.IndexOf("\file") + 5
        dotTxtPos = tempFile.ToLower.IndexOf(".txt", filePos)
        If Int32.TryParse(tempFile.ToLower.Substring(filePos, dotTxtPos - filePos), fileNumber) = True Then
            orderedFiles.Add(fileNumber, tempFile)
        End If
    Next

    If System.IO.File.Exists(CONST_DEST_FILE) = True Then
        System.IO.File.Delete(CONST_DEST_FILE)
    End If

    fileNumber = 0
    Do While orderedFiles.Count > 0
        fileNumber += 1
        If orderedFiles.ContainsKey(fileNumber) = True Then
            tempFile = orderedFiles(fileNumber)
            fileData = System.IO.File.ReadAllText(tempFile)
            System.IO.File.AppendAllText(CONST_DEST_FILE, fileData)
            orderedFiles.Remove(fileNumber)
        End If
    Loop

这可以通过以下Windows PowerShell一行程序完成(为了便于阅读,此处分为四行):

Get ChildItem
检索文件名,但它们的顺序不正确(按字母顺序排序,而不是按字母顺序排序)

Sort-Object
cmdlet用于按照指定对文件名进行排序,方法是在比较文件名之前填充文件名中的数字

gc
Get Content
的别名,它读取所有输入文件的内容

sc
Set Content
的别名,它将结果写入指定的文件


这里有一种使用C#的替代方法,以防您不能/不会使用PowerShell:

static class Program
{
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
    static extern int StrCmpLogicalW(string s1, string s2);

    static void Main()
    {
        string[] files = Directory.GetFiles(@"C:\Path\To\Files", "*.txt");
        Array.Sort(files, StrCmpLogicalW);
        File.WriteAllLines("result.txt", files.SelectMany(file => File.ReadLines(file)));
    }
}

这将使用
strmplogicalw
函数以正确的顺序获取文件名(该函数实际上是Windows资源管理器用于对文件名进行排序的函数)。

这可以通过以下Windows PowerShell一行程序来完成(为了可读性,在此处分为四行):

Get ChildItem
检索文件名,但它们的顺序不正确(按字母顺序排序,而不是按字母顺序排序)

Sort-Object
cmdlet用于按照指定对文件名进行排序,方法是在比较文件名之前填充文件名中的数字

gc
Get Content
的别名,它读取所有输入文件的内容

sc
Set Content
的别名,它将结果写入指定的文件


这里有一种使用C#的替代方法,以防您不能/不会使用PowerShell:

static class Program
{
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
    static extern int StrCmpLogicalW(string s1, string s2);

    static void Main()
    {
        string[] files = Directory.GetFiles(@"C:\Path\To\Files", "*.txt");
        Array.Sort(files, StrCmpLogicalW);
        File.WriteAllLines("result.txt", files.SelectMany(file => File.ReadLines(file)));
    }
}

这将使用
strmplogicalw
函数以正确的顺序获取文件名(该函数实际上是Windows资源管理器用于对文件名进行排序的函数)。

如果您愿意投入最少的时间,这应该可以很好地工作。对于完全自动化的过程,您需要计算出文件的数量(这不是很难,但我在这里省略了)。但对于20份报告来说,这可能就足够了

此外,批处理文件中的过程不是最优的。事实上,这很可怕。我认为这是O( N !). 使用批处理文件下面的版本可能更好