第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在讀取 CSV 文件時(shí)替換值并保存文件 (C#)

在讀取 CSV 文件時(shí)替換值并保存文件 (C#)

C#
叮當(dāng)貓咪 2023-05-13 16:20:59
我正在閱讀 csv 文件:string line;StreamReader sr = new StreamReader(file.ToString());while ((line = sr.ReadLine()) != null){    string col1 = line.Split(',')[10]; //old value    col1 = "my value"; //new value}sr.Close();sr.Dispose();我想用新值替換舊值。然后我需要保存更改后的文件。我怎樣才能做到這一點(diǎn)?
查看完整描述

2 回答

?
胡說(shuō)叔叔

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊

我建議使用File類(lèi)而不是Streams 和Readers。Linq在查詢(xún)數(shù)據(jù)的時(shí)候非常方便:


var modifiedData = File

  .ReadLines(file.ToString())

  .Select(line => line.Split(',')) 

  .Select(items => {

     //TODO: put relevant logic here: given items we should return csv line

     items[10] = "my value";


     return string.Join(",", items);

   })

  .ToList(); // <- we have to store modified data in memory


File.WriteAllLines(file.ToString(), modifiedData);

另一種可能性(例如,當(dāng)初始文件太長(zhǎng)而無(wú)法容納內(nèi)存時(shí))是將修改后的數(shù)據(jù)保存到一個(gè)臨時(shí)文件中,然后Move:


 var modifiedData = File

  .ReadLines(file.ToString())

  .Select(line => line.Split(',')) 

  .Select(items => {

     //TODO: put relevant logic here: given items we should return csv line

     items[10] = "my value";


     return string.Join(",", items);

   });


 string tempFile = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.tmp");


 File.WriteAllLines(tempFile, modifiedData);


 File.Delete(file.ToString());

 File.Move(tempFile, file.ToString());


查看完整回答
反對(duì) 回復(fù) 2023-05-13
?
慕斯709654

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊

一次讀取整個(gè)文件會(huì)占用大量?jī)?nèi)存。更不用說(shuō)創(chuàng)建它的平行副本了。使用流可以修復(fù)它。嘗試這個(gè):


void Modify()

{

    using (var fs = new FileStream(file, FileMode.Open, FileAccess.ReadWrite))

    {

        string line;

        long position;


        while ((line = fs.ReadLine(out position)) != null)

        {

            var tmp = line.Split(',');

            tmp[1] = "00"; // new value

            var newLine = string.Join(",", tmp);

            fs.WriteLine(position, newLine);

        }

    }

}

擴(kuò)展名:


static class FileStreamExtensions

{

    private static readonly char[] newLine = Environment.NewLine.ToCharArray();

    private static readonly int length = Environment.NewLine.Length;

    private static readonly char eof = '\uFFFF';


    public static string ReadLine(this FileStream fs, out long position)

    {

        position = fs.Position;

        var chars = new List<char>();

        char c;

        while ((c = (char)fs.ReadByte()) != eof && (chars.Count < length || !chars.Skip(chars.Count - 2).SequenceEqual(newLine)))

        {

            chars.Add(c);

        }

        fs.Position--;


        if (chars.Count == 0)

            return null;


        return new string(chars.ToArray());

    }


    public static void WriteLine(this FileStream fs, long position, string line)

    {

        var bytes = line.ToCharArray().Concat(newLine).Select(c => (byte)c).ToArray();

        fs.Position = position;

        fs.Write(bytes, 0, bytes.Length);

    }

}

缺點(diǎn)是您必須保持值的長(zhǎng)度相同。例如999和__9的長(zhǎng)度都是 3。解決這個(gè)問(wèn)題會(huì)使事情變得更加復(fù)雜,所以我會(huì)這樣處理。


查看完整回答
反對(duì) 回復(fù) 2023-05-13
  • 2 回答
  • 0 關(guān)注
  • 247 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)