如何在文本文件的特定列中插入值

时间:2015-01-12 07:02:13

标签: c#

我有3个txt文件,每天由我们的一个系统生成,需要在特定列位置插入值。

我已使用下面的代码完成了此操作,但是:

  1. 特定值(** LineText)需要在所有包含文本但不只是一行的行上。我不知道如何做到这一点。

  2. 我的代码当前插入了值(** LineText),但是它推动了所有内容。有没有办法在不推送其余数据的情况下插入值?

  3. 每天将生成3个文件,名称为REYYYYMMDD.TXT,TRYYYYMMDD.TXT和CTYYYYMMDD.TXT。有没有办法让代码拿起这些名字?我尝试过使用RE * .TXT,TR * .TXT等通配符,但它不起作用。

  4. 以下结果示例(我的代码目前使用 RE20150109.TXT 文件执行的操作)

    223016254     CSST45124                      
    167520001   EUR  SKBSUS12454                    
    158013456     CSST15568                      
    140490002     CSST14779                      
    167520004     SKBSUS88897                    
    515800001     CSST13679                      
    149370003     CSST32897                      
    161930009     RTVS10035       
    

    以下是我希望它做的但不确定如何:

    223016254  EUR  CSST45124                      
    167520001  EUR  SKBSUS12454                    
    158013456  EUR  CSST15568                      
    140490002  EUR  CSST14779                      
    167520004  EUR  SKBSUS88897                    
    515800001  EUR  CSST13679                      
    149370003  EUR  CSST32897                      
    161930009  EUR  RTVS10035  
    

    我的C#代码如下:

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace AstTXTEdit
    {
    class Program
    {
        static void Main(string[] args)
        {
            string REFilePath = @"C:\AstImport\RE20150109.TXT";
            int RElineNo = 1; //How do i set this to be all rows within the text file?
            string RELineText = "";
            int REPosition = 12;
    
            var REFullContent = File.ReadAllLines(REFilePath);
            RELineText = REFullContent[RElineNo];
            RELineText = RELineText.Insert(REPosition, "EUR");
            REFullContent[RElineNo] = RELineText;
            File.WriteAllLines(REFilePath, REFullContent);
    
            string TRFilePath = @"C:\AstImport\TR20150109.TXT";
            int TRlineNo = 1; //How do i set this to be all rows within the text file?
            string TRLineText = "";
            int TRPosition = 40;
    
            var FullContent = File.ReadAllLines(TRFilePath);
            TRLineText = FullContent[TRlineNo];
            TRLineText = TRLineText.Insert(TRPosition, "Y");
            FullContent[TRlineNo] = TRLineText;
            File.WriteAllLines(TRFilePath, FullContent);
    
            string CTFilePath = @"C:\AstImport\CT20150109.TXT";
            int CTlineNo = 1; //How do i set this to be all rows within the text file?
            string CTLineText = "";
            int CTPosition = 36;
    
            var CTFullContent = File.ReadAllLines(CTFilePath);
            CTLineText = FullContent[CTlineNo];
            CTLineText = CTLineText.Insert(CTPosition, "I");
            FullContent[CTlineNo] = CTLineText;
            File.WriteAllLines(CTFilePath, FullContent);
            }
        }
    }
    

    非常感谢任何援助。

    亲切的问候, 安德莉亚

3 个答案:

答案 0 :(得分:0)

问题3:

    List<string> fileNames = Directory.GetFiles(@"c:\AstImport", "RE*.TXT").ToList();
    fileNames.AddRange(Directory.GetFiles(@"c:\myfolder", "TR*.TXT"));

    foreach (string fileName in fileNames)
    {

    }

答案 1 :(得分:0)

问题1:使用linq

插入缺少的字符串会很容易
var v = File.ReadAllLines(path).Select(s => { string[] arr = s.Split(' '); if (arr[1] == "EUR") return s; else return String.Join(" ", new string[] { arr[0], "EUR", arr[1] }); });
File.WriteAllLines(path, v);

问题2:我不明白这个问题

问题3:Linq答案

Directory.GetFiles("path", "RE*.txt").ToList().ForEach(s => { /* Same as 1 */ });

答案 2 :(得分:0)

前两个问题:

  

特定值(** LineText)需要位于包含文本且不只是一行的所有行上。我不知道如何做到这一点。

  

我的代码当前插入了值(** LineText),但是它推动了一切。有没有办法在不推送其余数据的情况下插入值?

可以通过使用Select迭代所有行并通过先插入新字符串转换每一行来解决,然后在插入后删除相同长度的字符:

// Read entire file;
var lines = File.ReadAllLines("data2.txt");
var eur = "EUR"; // String to insert.
// Calc the position to insert at.
var insertAt = "223016254".Length + 1; 
var result = 
    lines
    .Select(x => 
        // Insert the 'eur' string.
        x.Insert(insertAt, eur)
        // Remove the spaces after insertion.
        .Remove(insertAt + eur.Length, eur.Length))
    .ToList();

就第三个问题而言:

  

每天将生成3个文件,名称为REYYYYMMDD.TXT,TRYYYYMMDD.TXT和CTYYYYMMDD.TXT。有没有办法让代码获取这些名称?

我不会使用Directory.GetFiles通配符,因为在大多数情况下它们太简单了。带有正则表达式文件名模式的linq查询可以做更多的事情:

string fileNamePattern = @"(CT|RE|TR)\d{8}\.TXT$"
string[] files = Directory.GetFiles(path);
files = 
    files
    .Where(fileName => 
        Regex.IsMatch(fileName, fileNamePattern , RegexOptions.IgnoreCase))
    .ToArray();