【问题标题】:How to prepend a header in a text file如何在文本文件中添加标题
【发布时间】:2012-05-10 10:48:22
【问题描述】:

如何在文本文件中添加/附加现有数据的文本开头。 基本上我需要在文本文件中的这些数据之前提供一个标题。此标头是动态数据。请注意,此数据来自外部源或 SQL 包或来自某个地方。因此,在文本文件中获取数据后,我想在文本文件的现有条目/数据中提供用逗号分隔的标题文本。

我在文本文件中的示例数据如下:

123,"SAV","CBS123",2010-10-10 00:00:00
456,"CUR","CBS456",2012-02-01 00:00:00

要添加的标题文本:

HDR<TableName><DateTime>

我需要的输出如下: 表名:帐户 日期时间:2012-05-09 12:52:00

HDRAccount2012-05-09 12:52:00
123,"SAV","CBS123",2010-10-10 00:00:00
456,"CUR","CBS456",2012-02-01 00:00:00

请帮助我如何在两种语言 VB6.0、C#.NET 中获得相同的效果

【问题讨论】:

  • 请贴出您目前编写的代码以读取文件。
  • 注意:嘿,我得到了我需要的结果。但我需要在 VB6.0 中也请用这种语言提供帮助....
  • 尝试自己将提供的 C# 代码转换为 VB6,如果您在某些转换上遇到困难,请为此提出一个新问题

标签: c# vb6


【解决方案1】:

请注意,从技术上讲,您不能“插入”到文件中并让所有内容“向下移动”。最好的办法是读取文件并用新行重写它。这是一种有效的方法:

static void InsertHeader(string filename, string header)
{
    var tempfile = Path.GetTempFileName();
    using (var writer = new StreamWriter(tempfile))
    using (var reader = new StreamReader(filename))
    {
        writer.WriteLine(header);
        while (!reader.EndOfStream)
            writer.WriteLine(reader.ReadLine());
    }
    File.Copy(tempfile, filename, true);
    File.Delete(tempfile);
}

感谢 this answer 的想法,但改进到足以使其值得单独发布。

现在,如果您想要接受表名和日期时间的东西,只需将其添加为第二个函数:

static void InsertTableHeader(string filename, string tableName, DateTime dateTime)
{
    InsertHeader(filename, 
                 String.Format("HDR{0}{1:yyyy-MM-dd HH:MM:ss}", 
                 tableName, 
                 dateTime));
}

因此,只需根据需要拨打InsertHeader(filename, "Account", DateTime.Now) 或类似电话。

【讨论】:

  • 请注意,与其他人不同,我们不会将所有内容都读入内存。看你需要什么。
【解决方案2】:
var fn = @"c:\temp\log.csv";
var hdr1 = "Account";
var hdr2 = "2012-05-09 12:52:00";
System.IO.File.WriteAllText(fn, System.String.Format("HDR {0} {1}\n{2}", hdr1, hdr2, System.IO.File.ReadAllText(fn)))

【讨论】:

  • 我怎样才能在 VB6.0 中达到同样的效果??
  • 注意:嘿,我得到了我需要的代码结果。但我需要在 VB6.0 中也请用这种语言提供帮助....
【解决方案3】:
String[] headerLines = new String[]{"HDR<TableName><DateTime>"};
String filename = "1.txt";
var newContent = headerLines.Union(File.ReadAllLines(filename));
File.WriteAllLines(filename, newContent);

【讨论】:

    【解决方案4】:

    衙门答案的VB6翻译。航空代码!我还没有编译这个,更不用说运行了 它!

    Sub InsertHeader(ByVal filename As String, ByVal header As String) 
      Dim tempfile As String 
      Dim readUnit As Integer 
      Dim writeUnit As Integer
    
      tempfile = "c:\tempfile" '' TODO generate better temporary filename - 
                    '' here is a link to help with getting path of temporary directory 
                    ''  http://vb.mvps.org/samples/SysFolders 
    
      readUnit = FreeFile 
      Open filename For Input As #readUnit 
      writeUnit = FreeFile 
      Open tempfile For Output As #writeUnit 
    
      Print #writeUnit, header
      Do Until Eof(readUnit) 
        Dim nextLine As String 
        Line Input #readUnit, nextLine 
        Print #writeUnit, nextLine 
      Loop
    
      Close readUnit 
      Close writeUnit 
    
      Kill filename
      FileCopy tempfile, filename 
      Kill tempfile  
    End sub 
    

    【讨论】:

    【解决方案5】:

    您可以按照第一个答案的相反顺序执行此操作,即首先将标题写入文本文件,然后以追加模式打开该文本文件,然后写入数据..以追加模式打开文件使用以下代码行:

       FileStream aFile = new FileStream(filePath, FileMode.Append,
       FileAccess.Write);       
       StreamWriter sw = new StreamWriter(aFile);       
       sw.Write(text);        
       sw.Close();       
       aFile.Close();
    

    【讨论】:

    • 问题的一半是关于设法“就地”执行此操作,因此您需要一些临时文件处理和移动。我的回答在概念上与您的回答相同(先写标题,然后写其余部分),但涵盖了问题的其余部分,并且不会无缘无故地打开文件两次。
    • 但在您的情况下,您需要明确删除临时文件。
    • 没有临时文件你打算怎么做?
    • 对不起,我没有完全阅读这个问题。数据来自其他来源的文本文件。所以你是对的@yamen 需要使用临时文件。我很抱歉
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2019-07-31
    • 2021-12-22
    • 2019-05-19
    • 1970-01-01
    • 2013-04-01
    相关资源
    最近更新 更多