C# 删除“-”之后的字符串,并将剩余的字符串和透视列分组
这是我在Excel中的实际数据,我能够在C Windows应用程序中的DataGridView中成功读取这些数据C# 删除“-”之后的字符串,并将剩余的字符串和透视列分组,c#,.net,pivot,oledbdataadapter,C#,.net,Pivot,Oledbdataadapter,这是我在Excel中的实际数据,我能够在C Windows应用程序中的DataGridView中成功读取这些数据 Test | Energy | --------------------- C018-3L-1 | 113 | C018-3L-2 | 79 | C018-3L-3 | 89 | C018-3L-4 | 90 | C018-3L-5 | 95 | C021-3T-1 | 115 | C021-3T-2 | 100
Test | Energy |
---------------------
C018-3L-1 | 113 |
C018-3L-2 | 79 |
C018-3L-3 | 89 |
C018-3L-4 | 90 |
C018-3L-5 | 95 |
C021-3T-1 | 115 |
C021-3T-2 | 100 |
但现在我希望DataGridView中的这些数据采用excel文件中的以下格式:
这是我的密码:
private void TensileEnergyData_Load(object sender, EventArgs e)
{
try
{
string sourcefilepath = ConfigurationManager.AppSettings["FilePath"].ToString();
string[] files = Directory.GetFiles(sourcefilepath, "*.xlsx");
foreach (string s in files)
{
string excelConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + s + ";Extended Properties='Excel 12.0;HDR=YES';";
// Create Connection to Excel Workbook
using (OleDbConnection connection = new OleDbConnection(excelConnectionString))
{
connection.Open();
da = new OleDbDataAdapter("Select Test, Energy FROM [Sheet1$]", connection);
da.Fill(dtExcelData);
connection.Close();
}
}
}
catch (Exception ex)
{
objDAL.SendExcepToDB(ex, "TensileEnergyData_Load");
MessageBox.Show("Fail to read data...!!");
}
dataGridView1.Visible = true;
dataGridView1.DataSource = dtExcelData;
}
如何使用Group By实现这一点?我将提供一个基于SQL Server的答案,正如您所要求的那样。在这里,您根本没有用[sql server]标记您的问题。。。希望这有助于 这是一个很好的理由,为什么你永远不应该在一个栏目里放一个以上的内容。将其存储在单独的列中,这样会容易得多 此外,这闻起来有点。。。这些问题应该在表示层中解决 然而,这可以做到:
DECLARE @tbl TABLE(Test VARCHAR(100),Energy INT);
INSERT INTO @tbl VALUES
('C018-3L-1',113)
,('C018-3L-2',79)
,('C018-3L-3',89)
,('C018-3L-4',90)
,('C018-3L-5',95)
,('C021-3T-1',115)
,('C021-3T-2',100);
SELECT p.*
FROM
(
SELECT B.Code
,(B.Number-1)/3 AS Line
,CONCAT('Energy-',CASE B.Number % 3 WHEN 0 THEN 3 ELSE B.Number % 3 END) AS ColumnName
,Energy
FROM @tbl t
CROSS APPLY(SELECT LEN(t.Test) - CHARINDEX('-',REVERSE(t.Test))) A(PosLastHyphen)
CROSS APPLY(SELECT LEFT(t.Test,PosLasthyphen) AS Code
,CAST(SUBSTRING(t.Test,PosLastHyphen+2,10) AS INT) AS Number) B
) tbl
PIVOT
(
MAX(Energy) FOR ColumnName IN([Energy-1],[Energy-2],[Energy-3])
) p
ORDER BY Code,Line;
结果
+---------+------+----------+----------+----------+
| Code | Line | Energy-1 | Energy-2 | Energy-3 |
+---------+------+----------+----------+----------+
| C018-3L | 0 | 113 | 79 | 89 |
+---------+------+----------+----------+----------+
| C018-3L | 1 | 90 | 95 | NULL |
+---------+------+----------+----------+----------+
| C021-3T | 0 | 115 | 100 | NULL |
+---------+------+----------+----------+----------+
一些解释
我使用交叉应用程序来计算代码和运行编号之间的间隔。然后我用整数除法计算组,用模运算符%将其分成三列。你能解释一下下面的格式吗?为什么测试C018-3L的能量-1是90?@SeM实际上我想要3人一组的能量,所以excel文件中的测试“`C018-3L-4``90自动位于数据网格视图中的能量-1列下。您好@Shnugo先生。。我成功地解决了我的问题。我创建了查询的存储过程,从excel文件中读取数据后,我将该数据存储在数据表中,并将该数据表传递给存储过程,然后在数据网格视图中获得所需的输出。再次非常感谢。@dmegha这听起来有点复杂,但我很高兴这对你有用@dmegha我最后想请你接受一个你最喜欢的答案来结束你之前的第二个问题。Thx和快乐编码!
+---------+------+----------+----------+----------+
| Code | Line | Energy-1 | Energy-2 | Energy-3 |
+---------+------+----------+----------+----------+
| C018-3L | 0 | 113 | 79 | 89 |
+---------+------+----------+----------+----------+
| C018-3L | 1 | 90 | 95 | NULL |
+---------+------+----------+----------+----------+
| C021-3T | 0 | 115 | 100 | NULL |
+---------+------+----------+----------+----------+