2017-11-16 2 views
0

Ich kopiere einige Daten vom SAP-GUI-Bildschirm in die Zwischenablage. Es sieht wie folgt aus, wenn ich es in Editor oder einen Texteditor einfügen.So erhalten Sie Daten aus der Texttabellenfolge in C# zuverlässiger und schneller

SAP GUI data

Ich möchte nur drei Felder [Erstellt durch, PO Datum, Dokument] aus der Zwischenablage Texttabelle String.

Zur Zeit kann ich Daten wie folgt lesen.

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); 
    } 
    } 
} 

Kann jemand einen besseren Weg vorschlagen, dies zu tun, ohne die Saite zu sehr zu manipulieren.

+5

Wie wäre es 'Split' –

+1

Und was Subroutinen statt Kopie mit/einfügen? – Sefe

+0

Es sieht aus wie Daten im festen Format, Sie könnten nur die Werte von bestimmten Stellen in der Zeichenfolge – BugFinder

Antwort

2

Hier ist ein Ansatz für Ihr Problem. In diesem Beispiel wird der Text zuerst nach Zeilen aufgeteilt, dann wird der Header verwendet, um die benötigten Daten zu finden. Anschließend werden die Zeilen durchlaufen und Daten abgerufen.

Ich habe es nicht getestet (ich könnte, wenn Sie Text anstelle dieses Screenshots eingefügt :)), aber es sollte funktionieren. Sehen Sie sich Kommentare im Code an, um Erläuterungen zu erhalten.

Wenn Sie weitere Fragen haben, zögern Sie nicht zu fragen.

EDIT: Hinzugefügt fehlende Methode

//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

Hilfreich. Vielen Dank für Ihre Zeit. –

+0

@a_programmer froh, ich könnte helfen. Ich habe gesehen, dass niemand eine Antwort schreibt (obwohl die Kommentare gut waren) und ich wusste nicht, wie fortgeschritten Sie sind, also nahm ich mir ein wenig Zeit, um ein Beispiel zu schreiben – Nino

+0

Ich schätze Ihr Verständnis der Leute. Ich bin kein Experte, aber ich versuche es zu sein. Ich habe meine eigene Arbeit gemacht, um Daten mit 'string.Split()' zu bekommen und Ihr Code hat mich auch dazu gebracht, meinen Code perfekt zu machen und zu funktionieren. –

Verwandte Themen