標籤:
一、引言
受朋友之託,處理一份點雲資料,格式:“X[m] Y[m] Z[m] R[dB] G[dB] B[dB]”,總共63w個點,轉換成的格式是:“點名,,X[m], Y[m], Z[m]”。如果經常有座標檔案轉換就使用代碼方法,偶爾使用的話就使用Excel。用Excel的話,直接把尾碼名改成.xlsx,接下來就是對整列進行插入、更改等事情了,最後另存新檔txt格式或者dat格式。
二、知識準備
1、檔案讀寫
2、字串處理
三、需要注意的地方
1、60幾萬個點,資料量還行,所以思路和資料結構要格外注意,能省則省。鄙人昨天走了彎路,拿19萬個點測試時候花了0.75秒有點沾沾自喜,今天重新到回去看,寫的什麼玩意兒,把代碼重新修改了一下,測試顯示,19萬個點0.45秒左右,63萬個點1.15秒左右。
2、檔案讀寫要注意檔案流的開啟與關閉。
四、代碼
using System;using System.Collections.Generic;using System.Diagnostics;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 點雲轉pt{ class Program { static void Main(string[] args) { //測時 Stopwatch st = new Stopwatch(); st.Start(); string wjming = "座標" + "(" + DateTime.Now.ToString("yyyyMMddhhmmss") + ")"; string path = @"E:\C#\點雲轉pt2\點雲轉pt2\bin\Debug"; File.WriteAllText(path + "\\" + wjming + ".txt", null); List<座標> result = diaoqu(@"C:\Users\Ouy_\Desktop\all-Octree (0.1).txt"); using (StreamWriter sw = new StreamWriter(wjming + ".txt")) { foreach (var item1 in result) { sw.WriteLine(item1.Name + ",," + item1.X + "," + item1.Y + "," + item1.H); } } st.Stop(); Console.WriteLine("OK!Time: " + st.Elapsed); } static List<座標> diaoqu(string a) { FileStream fs = new FileStream(a, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); StreamReader m_streamReader = new StreamReader(fs); m_streamReader.BaseStream.Seek(0, SeekOrigin.Begin); int index = 0; string strLine = m_streamReader.ReadLine(); List<座標> result = new List<座標>(); // 從資料流中讀取每一行,直到檔案的最後一行 while (strLine != null) { string[] s = strLine.Split(‘ ‘);//txt檔案格式分隔字元 try { 座標 pt = new 座標((++index).ToString(), s[0], s[1], s[2]); result.Add(pt); strLine = m_streamReader.ReadLine(); } catch (Exception ex) { Console.Write(ex.ToString()); } } fs.Close(); m_streamReader.Close(); return result; } } class 座標 { public string Name { get; set; } public string X { get; set; } public string Y { get; set; } public string H { get; set; } public 座標(string name, string x, string y, string h) { Name = name; X = x; Y = y; H = h; } }}
座標格式提取轉換的兩種方法C#、Excel