[英]how can i correctly parse a text file delimited by white space
下面是我的示例文本文件
{
這是我的架構文件
[Sample File.txt]
ColNameHeader=True
Format=TabDelimited
CharacterSet=ANSI
這是我到目前為止嘗試讀取上面的示例文件的代碼,從上面的文本文件中讀取的數據行應該返回以在dataGridView控件中顯示。 問題是,它作為單列返回,但我想使用這些空格作為列分隔符。 我嘗試了不同的角色分隔符並取得了成功。
public DataSet LoadCSV(int numberOfRows)
{
DataSet ds = new DataSet();
// Creates and opens an ODBC connection
string strConnString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + this.dirCSV.Trim() + ";Extensions=asc,csv,tab,txt;Persist Security Info=False";
string sql_select;
OdbcConnection conn;
conn = new OdbcConnection(strConnString.Trim());
conn.Open();
//Creates the select command text
if (numberOfRows == -1)
{
sql_select = "select * from [" + this.FileNevCSV.Trim() + "]";
}
else
{
sql_select = "select top " + numberOfRows + " * from [" + this.FileNevCSV.Trim() + "]";
}
//Creates the data adapter
OdbcDataAdapter obj_oledb_da = new OdbcDataAdapter(sql_select, conn);
//Fills dataset with the records from CSV file
obj_oledb_da.Fill(ds, "csv");
//closes the connection
conn.Close();
return ds;
}
並設置dataGridView的數據源
// loads the first 500 rows from CSV file
this.dataGridView_preView.DataSource = LoadCSV(500);
this.dataGridView_preView.DataMember = "csv";
我,在datagridview中得到這個,我得到一列,但我希望看到數據返回為7列。
另外,我不知道F2和F3列的來源
我可能會以不同的方式做到這一點。 我會使用StreamReader,逐行讀入文件,將字符串分解為對象屬性,並將對象存儲在列表中。 然后將列表綁定到datagridviews數據源。 我演示了兩種快速方法。
如果文件是tab分隔的,就像它似乎一樣,將該行拆分為一個數組,並將每個索引分配給一個屬性,如此。
public partial class Form1 : Form
{
private void Form1_Load(object sender, EventArgs e)
{
var rows = new List<Row>();
var sr = new StreamReader(@"C:\so_test.txt");
while (!sr.EndOfStream)
{
string s = sr.ReadLine();
if (!String.IsNullOrEmpty(s.Trim()))
{
rows.Add(new Row(s));
}
}
sr.Close();
dataGridView1.DataSource = rows;
}
}
public class Row
{
public double Number1 { get; set; }
public double Number2 { get; set; }
public double Number3 { get; set; }
public double Number4 { get; set; }
public double Number5 { get; set; }
public double Number6 { get; set; }
public double Number7 { get; set; }
public string Date1 { get; set; }
public Row(string str)
{
string[] separator = { "\t" };
var arr = str.Split(separator, StringSplitOptions.None);
Number1 = Convert.ToDouble(arr[0]);
Number2 = Convert.ToDouble(arr[1]);
Number3 = Convert.ToDouble(arr[2]);
Number4 = Convert.ToDouble(arr[3]);
Number5 = Convert.ToDouble(arr[4]);
Number6 = Convert.ToDouble(arr[5]);
Number7 = Convert.ToDouble(arr[6]);
Date1 = arr[7];
}
}
如果數據是制表符分隔的,但符合每列的嚴格起點和終點,則可以將每列的起點和長度聲明為常量,並通過子字符串獲取。 這只需要更改Row類中的代碼,就像這樣。 我從簡潔中留下了常量,並且只是對它們進行了硬編碼。
public Row(string str)
{
Number1 = Convert.ToDouble(str.Substring(4, 6));
Number2 = Convert.ToDouble(str.Substring(16, 6));
Number3 = Convert.ToDouble(str.Substring(28, 7));
Number4 = Convert.ToDouble(str.Substring(40, 7));
Number5 = Convert.ToDouble(str.Substring(52, 6));
Number6 = Convert.ToDouble(str.Substring(64, 6));
Number7 = Convert.ToDouble(str.Substring(76, 6));
Date1 = str.Substring(88, 24);
}
這個修改過的schema.ini文件確實解決了這個問題。
[Sample File.txt]
Format=FixedLength
Format=TabDelimited
MaxScanRows=25
CharacterSet=ANSI
Col1=Col1 Memo Width 10
Col2=Col2 Memo Width 15
Col3=Col3 Memo Width 11
Col4=Col4 Memo Width 12
Col5=Col5 Memo Width 10
Col6=Col6 Memo Width 11
Col7=Col7 Memo Width 150
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.