C# 将制表符分隔值从剪贴板复制到datagridview
当我从应用程序复制剪贴板中的原始数据时,它看起来像这样C# 将制表符分隔值从剪贴板复制到datagridview,c#,C#,当我从应用程序复制剪贴板中的原始数据时,它看起来像这样 Trade Info NE62 -- NE62 Symbol Side Quantity Avg Price ClientAcct ESU8 BUY 100 2809.2500 35199008 FLT.V SELL 15,000 1.7040 tB324aV
Trade Info
NE62 -- NE62
Symbol Side Quantity Avg Price ClientAcct
ESU8 BUY 100 2809.2500 35199008
FLT.V SELL 15,000 1.7040 tB324aV
TRST.TO SELL 4,850 7.1500 tB324aVV
YGR.TO SELL 5,200 5.3806 tB324aV
我使用regex删除了最上面一行(Trade Info NE62--NE62),因为它对于每个用户都是可变的 然后,我使用以下字符串动态分配列。每个用户都有一个可变的列长度,这取决于他们需要的信息
string columnarray = s.Substring(0, s.LastIndexOf("\t\t\r\n\r\n"));
剩下的字符串存储在另一个变量中,该变量将填充在datatable中,这正是我很难理解的。下面是我需要填入数据表的剩余值 首选的解决方案是循环遍历字符串,每次点击时将其拆分\t\t并将其放在同一行中,点击后跳转到下一行。\r\n
ESU8\t\tBUY\t\t100\t\t2809.2500\t\tB324aV\t\t\r\nFLT.V\t\tSELL\t\t15,000\t\t1.7040\t\tB324aV\t\t\r\nTRST.TO\t\tSELL\t\t4,850\t\t7.1500\t\tB324aV\t\t\r\nYGR.TO\t\tSELL\t\t5,200\t\t5.3806\t\tB324aV\t
理想的结果应该是这样的
Ticker | Action | Quantity | Price | Acc Number
---------------------------------------------------
ESU8 | BUY | 100 | 2809.2500 | 900000
FLT.V | SELL | 15,000 | 1.7040 | B324aV
TRT.TO | SELL | 4,850 | 7.1500 | f23AAA
YGR.TO | SELL | 5,200 | 5.3806 | 42ABBB
如果我正确理解了这个问题,下面的代码应该可以完成这项工作:
public Form1()
{
InitializeComponent();
dataGridView1.DataSource = CreateTable();
}
private DataTable CreateTable()
{
var str = "ESU8\t\tBUY\t\t100\t\t2809.2500\t\tB324aV\t\t\r\nFLT.V\t\tSELL\t\t15,000\t\t1.7040\t\tB324aV\t\t\r\nTRST.TO\t\tSELL\t\t4,850\t\t7.1500\t\tB324aV\t\t\r\nYGR.TO\t\tSELL\t\t5,200\t\t5.3806\t\tB324aV\t";
DataTable dt = new DataTable();
dt.Columns.Add("Ticker", typeof(string));
dt.Columns.Add("Action", typeof(string));
dt.Columns.Add("Quantity", typeof(double));
dt.Columns.Add("Price", typeof(double));
dt.Columns.Add("Acc Number", typeof(string));
str = str.Replace("\t\t", " ");
str = str.Replace(",", ".");
str = str.Replace("\r\n", "");
var r = str.Split();
int rows = r.Length / 5;
for (int i = 0; i < rows; i++)
{
dt.Rows.Add(
r[i * 5 + 0],
r[i * 5 + 1],
double.Parse(r[i * 5 + 2]),
double.Parse(r[i * 5 + 3]),
r[i * 5 + 4]);
}
return dt;
}
public Form1()
{
初始化组件();
dataGridView1.DataSource=CreateTable();
}
私有数据表CreateTable()
{
var str=“ESU8\t\tBUY\t\t100\t\t2809.2500\t\tB324aV\t\t\r\nFLT.V\t\tSELL\t\t15000\t\t1.7040\t\tB324aV\t\t\r\nTRST.TO\t\tSELL\t\t4850\t\t7.1500\t\tB324aV\t\t\t\t\t\r\nYGR.TO\t\tSELL\t\t\t\t52200\t\t5.3806\t\tbav\t”;
DataTable dt=新的DataTable();
dt.Columns.Add(“Ticker”,typeof(string));
添加(“动作”,类型(字符串));
dt.列。添加(“数量”,类型(双);
dt.列。添加(“价格”,类型(双);
添加(“Acc编号”,类型(字符串));
str=str.Replace(“\t\t”,”);
str=str.Replace(“,”,“);
str=str.Replace(“\r\n”,”);
var r=str.Split();
int rows=r.长度/5;
对于(int i=0;i
输出:
如果我正确理解了问题,下面的代码应该可以完成这项工作:
public Form1()
{
InitializeComponent();
dataGridView1.DataSource = CreateTable();
}
private DataTable CreateTable()
{
var str = "ESU8\t\tBUY\t\t100\t\t2809.2500\t\tB324aV\t\t\r\nFLT.V\t\tSELL\t\t15,000\t\t1.7040\t\tB324aV\t\t\r\nTRST.TO\t\tSELL\t\t4,850\t\t7.1500\t\tB324aV\t\t\r\nYGR.TO\t\tSELL\t\t5,200\t\t5.3806\t\tB324aV\t";
DataTable dt = new DataTable();
dt.Columns.Add("Ticker", typeof(string));
dt.Columns.Add("Action", typeof(string));
dt.Columns.Add("Quantity", typeof(double));
dt.Columns.Add("Price", typeof(double));
dt.Columns.Add("Acc Number", typeof(string));
str = str.Replace("\t\t", " ");
str = str.Replace(",", ".");
str = str.Replace("\r\n", "");
var r = str.Split();
int rows = r.Length / 5;
for (int i = 0; i < rows; i++)
{
dt.Rows.Add(
r[i * 5 + 0],
r[i * 5 + 1],
double.Parse(r[i * 5 + 2]),
double.Parse(r[i * 5 + 3]),
r[i * 5 + 4]);
}
return dt;
}
public Form1()
{
初始化组件();
dataGridView1.DataSource=CreateTable();
}
私有数据表CreateTable()
{
var str=“ESU8\t\tBUY\t\t100\t\t2809.2500\t\tB324aV\t\t\r\nFLT.V\t\tSELL\t\t15000\t\t1.7040\t\tB324aV\t\t\r\nTRST.TO\t\tSELL\t\t4850\t\t7.1500\t\tB324aV\t\t\t\t\t\r\nYGR.TO\t\tSELL\t\t\t\t52200\t\t5.3806\t\tbav\t”;
DataTable dt=新的DataTable();
dt.Columns.Add(“Ticker”,typeof(string));
添加(“动作”,类型(字符串));
dt.列。添加(“数量”,类型(双);
dt.列。添加(“价格”,类型(双);
添加(“Acc编号”,类型(字符串));
str=str.Replace(“\t\t”,”);
str=str.Replace(“,”,“);
str=str.Replace(“\r\n”,”);
var r=str.Split();
int rows=r.长度/5;
对于(int i=0;i
输出:
所以我设计了一个似乎效果很好的解决方案。我使用解析器解析字符串,并在格式化字符串后将其添加到dataTable中,以使其便于解析。把它贴在这里,以防将来有人需要帮助
string[] ColArray = Regex.Split(columnarray, "\t\t");
string[] DatArray = Regex.Split(dataArray, "\t\t");
DatArray = DatArray.Where(x => !string.IsNullOrEmpty(x)).ToArray();
//Join all the split string using (+)
string datstring = string.Join("+", DatArray);
//Remove the additional (+) symbol infront of the \r\n\ to match array length
datstring = Regex.Replace(datstring, @"[+\\r\\]\B", "");
DataTable d = new DataTable();
foreach (string b in ColArray{
d.Columns.Add(b);
}
// use a parser to parse through the string and add the items to your datatable
using (var reader = new StringReader(datstring))
{
TextFieldParser parser = new TextFieldParser(reader)
{ HasFieldsEnclosedInQuotes = false, Delimiters = new string[] { "+" } };
while(!parser.EndOfData)
{
var drow = d.NewRow();
drow.ItemArray = parser.ReadFields();
d.Rows.Add(drow);
}
}
DGV.Datasource = d;
所以我设计了一个似乎很有效的解决方案。我使用解析器解析字符串,并在格式化字符串后将其添加到dataTable中,以使其便于解析。把它贴在这里,以防将来有人需要帮助
string[] ColArray = Regex.Split(columnarray, "\t\t");
string[] DatArray = Regex.Split(dataArray, "\t\t");
DatArray = DatArray.Where(x => !string.IsNullOrEmpty(x)).ToArray();
//Join all the split string using (+)
string datstring = string.Join("+", DatArray);
//Remove the additional (+) symbol infront of the \r\n\ to match array length
datstring = Regex.Replace(datstring, @"[+\\r\\]\B", "");
DataTable d = new DataTable();
foreach (string b in ColArray{
d.Columns.Add(b);
}
// use a parser to parse through the string and add the items to your datatable
using (var reader = new StringReader(datstring))
{
TextFieldParser parser = new TextFieldParser(reader)
{ HasFieldsEnclosedInQuotes = false, Delimiters = new string[] { "+" } };
while(!parser.EndOfData)
{
var drow = d.NewRow();
drow.ItemArray = parser.ReadFields();
d.Rows.Add(drow);
}
}
DGV.Datasource = d;
我跟不上。是您没有在上拆分的问题,所以您将所有数据都放在一个大行中?@Evan Hi Evan我更新了问题,希望现在对您有所帮助。是的,我在计算如何通过拆分\t\t填充同一行中的所有列时遇到了问题,并在点击后跳转到下一列\r\n我在跟随时遇到了问题。是您没有在上拆分的问题,所以您将所有数据都放在一个大行中?@Evan Hi Evan我更新了问题,希望现在对您有所帮助。是的,我在计算如何填充同一行中的所有列时遇到了问题,方法是拆分\t\t并在点击后跳转到下一列\r\n我更新了一点问题。这似乎可行,但它违背了基于剪贴板中第一行数据动态分配列的目的,因为每个用户都有一个可变的列号@L_JHi我稍微更新了这个问题。这似乎可行,但它违背了基于剪贴板中第一行数据动态分配列的目的,因为每个用户都有一个可变的列号@L_JHi,这使得表非常硬编码。因为每个用户都有不同的列和行,这取决于他们在endHi上如何格式化他们的表,这使得表非常硬编码。因为每个用户都有不同的列和行,这取决于他们端部表格的格式
Ticker | Action | Quantity | Price | Acc Number
---------------------------------------------------
ESU8 | BUY | 100 | 2809.2500 | 900000
FLT.V | SELL | 15,000 | 1.7040 | B324aV
TRT.TO | SELL | 4,850 | 7.1500 | f23AAA
YGR.TO | SELL | 5,200 | 5.3806 | 42ABBB
public Form1()
{
InitializeComponent();
dataGridView1.DataSource = CreateTable();
}
private DataTable CreateTable()
{
var str = "ESU8\t\tBUY\t\t100\t\t2809.2500\t\tB324aV\t\t\r\nFLT.V\t\tSELL\t\t15,000\t\t1.7040\t\tB324aV\t\t\r\nTRST.TO\t\tSELL\t\t4,850\t\t7.1500\t\tB324aV\t\t\r\nYGR.TO\t\tSELL\t\t5,200\t\t5.3806\t\tB324aV\t";
DataTable dt = new DataTable();
dt.Columns.Add("Ticker", typeof(string));
dt.Columns.Add("Action", typeof(string));
dt.Columns.Add("Quantity", typeof(double));
dt.Columns.Add("Price", typeof(double));
dt.Columns.Add("Acc Number", typeof(string));
str = str.Replace("\t\t", " ");
str = str.Replace(",", ".");
str = str.Replace("\r\n", "");
var r = str.Split();
int rows = r.Length / 5;
for (int i = 0; i < rows; i++)
{
dt.Rows.Add(
r[i * 5 + 0],
r[i * 5 + 1],
double.Parse(r[i * 5 + 2]),
double.Parse(r[i * 5 + 3]),
r[i * 5 + 4]);
}
return dt;
}
string s = @"Trade Info
NE62 -- NE62
Symbol Side Quantity Avg Price ClientAcct
ESU8 BUY 100 2809.2500 35199008
FLT.V SELL 15,000 1.7040 tB324aV
TRST.TO SELL 4,850 7.1500 tB324aVV
YGR.TO SELL 5,200 5.3806 tB324aV";
var data = s.Split(new char[] { '\r','\n'},StringSplitOptions.RemoveEmptyEntries)
.SkipWhile(x => !x.StartsWith("Symbol"))
.Skip(1)
.Select(line => line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries))
.Select(d => new {
Symbol = d[0],
Side = d[1],
Quantity = int.Parse(d[2].Replace(",","")),
AvgPrice = decimal.Parse(d[3]),
ClientAcct = d[4]
});
yourDataGridView.DataSource = data.ToList();
string[] ColArray = Regex.Split(columnarray, "\t\t");
string[] DatArray = Regex.Split(dataArray, "\t\t");
DatArray = DatArray.Where(x => !string.IsNullOrEmpty(x)).ToArray();
//Join all the split string using (+)
string datstring = string.Join("+", DatArray);
//Remove the additional (+) symbol infront of the \r\n\ to match array length
datstring = Regex.Replace(datstring, @"[+\\r\\]\B", "");
DataTable d = new DataTable();
foreach (string b in ColArray{
d.Columns.Add(b);
}
// use a parser to parse through the string and add the items to your datatable
using (var reader = new StringReader(datstring))
{
TextFieldParser parser = new TextFieldParser(reader)
{ HasFieldsEnclosedInQuotes = false, Delimiters = new string[] { "+" } };
while(!parser.EndOfData)
{
var drow = d.NewRow();
drow.ItemArray = parser.ReadFields();
d.Rows.Add(drow);
}
}
DGV.Datasource = d;