我有3个txt文件,每天由我们的一个系统生成,需要在特定列位置插入值。
我已使用下面的代码完成了此操作,但是:
特定值(** LineText)需要在所有包含文本但不只是一行的行上。我不知道如何做到这一点。
我的代码当前插入了值(** LineText),但是它推动了所有内容。有没有办法在不推送其余数据的情况下插入值?
每天将生成3个文件,名称为REYYYYMMDD.TXT,TRYYYYMMDD.TXT和CTYYYYMMDD.TXT。有没有办法让代码拿起这些名字?我尝试过使用RE * .TXT,TR * .TXT等通配符,但它不起作用。
以下结果示例(我的代码目前使用 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);
}
}
}
非常感谢任何援助。
亲切的问候, 安德莉亚
答案 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();