2017-11-16 10 views
0

SAP GUI画面からクリップボードにデータをコピーしています。メモ帳やテキストエディタに貼り付けると、以下のようになります。C#のテキストテーブル文字列からデータをより確実かつ迅速に取得する方法

SAP GUI data

私はクリップボードのテキストテーブルの列から[によって作成され、PO日、文書]のみ3つのフィールドをしたいです。

現在、以下のようにデータを読み取っています。

public class DocData 
{ 
    public string CreatedBy { get; set; } 
    public string PODate { get; set; } 
    public string Document { get; set; } 
} 

private void GetDocumentData() 
{ 
    var clipboardData = Clipboard.GetText(TextDataFormat.Text); 
    List<DocData> docDataList = new List<DocData>(); 
    for (int separatorCounter = 20; separatorCounter < clipboardData.Count(); separatorCounter = separatorCounter + 13) 
    { 
    DocData docData = new DocData(); 
    int index = GetNthIndex(clipboardData, '|', separatorCounter); 
    if (index != -1) 
    { 
    var dataString = clipboardData.Substring(index + 1); 
    var sepIndex = dataString.IndexOf('|'); 
    if (sepIndex != -1) 
    { 
    docData.CreatedBy = dataString.Substring(0, sepIndex).Trim(); 
    } 
    } 
    index = GetNthIndex(clipboardData, '|', separatorCounter + 2); 
    if (index != -1) 
    { 
    var dataString = clipboardData.Substring(index + 1); 
    var sepIndex = dataString.IndexOf('|'); 
    if (sepIndex != -1) 
    { 
    docData.PODate = dataString.Substring(0, sepIndex).Trim(); 
    } 
    } 
    index = GetNthIndex(clipboardData, '|', separatorCounter + 4); 
    if (index != -1) 
    { 
    var dataString = clipboardData.Substring(index + 1); 
    var sepIndex = dataString.IndexOf('|'); 
    if (sepIndex != -1) 
    { 
    docData.Document = dataString.Substring(0, sepIndex).Trim(); 
    } 
    } 
    if (!string.IsNullOrEmpty(docData.Document)) 
    { 
    docDataList.Add(docData); 
    } 
    } 
} 

文字列をあま​​り操作しないと、これを行うより良い方法を提案できます。

+5

どうSplit' –

+1

'についてそして、何のコピー/ペーストの代わりにサブルーチンを使用してはどうですか? – Sefe

+0

固定フォーマットデータのように見えますが、文字列 – BugFinder

答えて

2

ここでは、問題に対するアプローチの1つです。この例では、まずテキストを行単位で分割し、必要なデータの位置を見出すためにheaderを使い、線を繰り返してデータを取得します。

テストしていない(このスクリーンショットの代わりにテキストを貼り付けるとできます:))、動作するはずです。説明のためにコード内のコメントを見てください。

ご不明な点がございましたら、お気軽にお問い合わせください。

EDIT:追加されました見つからないメソッド

//result list 
List<DocData> docDataList = new List<DocData>(); 

//get clipboard data 
string clipboardData = Clipboard.GetText(TextDataFormat.Text); 

//split it to array of lines using Environment.NewLine (\r\n); 
string[] reportLines = clipboardData.Split(new[] { Environment.NewLine }, StringSplitOptions.None); 

if (reportLines.Length < 4) //just an example of checking if there's enough lines 
    throw new Exception("wrong number of lines"); 

//get correct indexes by reading header (positioned on third line, index 2) - in case order changes 
int createdIndex = GetColumnIndex(reportLines[2], "Created by"); 
int PODateIndex = GetColumnIndex(reportLines[2], "PO Date"); 
int documentIndex = GetColumnIndex(reportLines[2], "Document"); 

//when you have indexes, loop through remaining lines, starting at fifth (index 4) and get data from that "columns" 
for (int i = 4; i<reportLines.Length; i++) 
{ 
    //now split current line by pipes 
    string[] lineData = reportLines[i].Split('|'); 
    //create instance of your class and add data from specific indexes 
    DocData docData = new DocData() 
    { 
     CreatedBy = lineData[createdIndex].Trim(), //also, trim ending spaces, 
     PODate = lineData[PODateIndex].Trim(), 
     Document = lineData[documentIndex].Trim() 
    }; 
    docDataList.Add(docData); 
} 

public int GetColumnIndex(string headerLine, string columnName) 
{ 
    List<string> headerNames = headerLine.Split('|').ToList(); //split header columns using pipe |. 

    //get index of column by trimming and searching throught header column names 
    return headerNames.IndexOf(headerNames.FirstOrDefault(h => h.Trim().Equals(columnName, StringComparison.InvariantCultureIgnoreCase))); 

} 
+0

便利です。あなたのお時間をありがとうございました。 –

+0

@a_programmerうれしい私は助けることができます。誰も答えを書いていないことを知っています(コメントは良好でした)。私はあなたの知識レベルを知らなかったので、例を書くのに少し時間がかかりました。 – Nino

+0

私は人々の理解のレベルに感謝します。私は専門家ではありませんが、しようとしています。私は 'string.Split()'でデータを取得するために自分自身で作業していましたが、コードでもコードを完璧にして作業するように指示しました。 –

関連する問題