2014-03-12 2 views
0

일부 .ascii 파일이 있습니다. Excel에서 열 때 처음 몇 줄은 다음과 같습니다..ascii 파일을 읽고 변환하는 방법? (파이썬)

>ETASAsciiItemFile record CrLf Tab 
>sampleCount 22327  
>time sys_inp_amb_temp_degc\CCP:1  
>f8 f4  
>s °C  
>0,454984023542835 235,938  
>0,671164096921757 235,938  

"정상적인"숫자를 제공 할 수 있어야합니다. CSV로 변환하는 것이 이상적입니다. 내가

app = QApplication(sys.argv) 
fname1 = unicode(QFileDialog.getOpenFileName()) 
app.quit 

csv1_array = [] 
with open(fname1,'rb') as csv1_doc: 
    csv1_array += csv.reader(csv1_doc) 

path_plus_title1 = (fname1.strip('.ascii')) +'.csv' 

with open(path_plus_title1, 'wb') as outfile: 
    writer = csv.writer(outfile) 
    writer.writerows(csv1_array) 

내가, 내가 함수로이 비트를 넣어해야합니다 알고

오전, 나는 것 -

여기에 내가 가진거야. 나는 단지 더러운 것을 빨리하려고 애썼다. 여기

내 출력이 현재의 모습입니다 : 명확하게

>"ETASAsciiItemFile record CrLf Tab"   
>"sampleCount 22327   "   
>"time sys_inp_amb_temp_degc\CCP:1 "  
>"f8 f4 "  
>"s ""°C"" "  
>0 "454984023542835 23" "5938 " 
>0 "671164096921757 23" "5938 " 
  • , 나는 그게 문제, 유니 코드 인 것처럼 엽니을 말하고 있기 때문이다. 그것은 ASCII로 옵션을 거부합니다.

  • 또한 쉼표가 구분 기호로 사용됩니다. 또한 문제.

의견이 있으십니까? 파이썬 옵션 대신 엑셀 옵션은 완전히 환영합니다.

+1

'°'기호는 ASCII의 일부가 아닙니다. 그리고 당신이 여기에서 묻고있는 것을 결정하는 것은 정말로 어렵습니다. –

+0

필자가 파일에 대해 알고있는 것은 확장자가 .ascii 인 것입니다. Excel로 열 것이라고 말했을 때, 어떻게 보입니까? 나는이 가치들이 실제로 무엇인지 알아낼 필요가있다. ... – mauve

+0

나는 그것을 이해했다고 생각한다. 이것들은 정말로 .txt 파일이고 the는 있습니다. 그러나 Excel은 이해하지 못합니다. 저는 워드 패드로 열어 쉼표를 마침표로 바꿉니다. – mauve

답변

1

그 유니 코드는 단지 파일 이름입니다. 파일의 내용에는 아무런 영향을주지 않습니다.

파일을 읽고 쓰는 중입니다. 이것이 당신이 정말로 원하는 것인지 아닌지는 질문에서 분명하지 않습니다.

path_plus_title1 = (fname1.strip('.ascii')) +'.csv' 

strip()

당신이 그것을하지 생각하지 않습니다

이 라인에 다소 비열한 버그가 있습니다. 제거 할 세트의 문자열 끝에있는 모든 문자를 제거합니다. 따라서 fname1이 예를 들어 'isac.ascii' 인 경우 strip()은 빈 문자열을 생성합니다!

마지막으로,이 질문은 분명히 밝혀지지 않았기 때문에 "0,671164096921757"을 "0.671164096921757"로 변환하려고합니다. 즉, 소수 구분 기호로 쉼표를 사용하는 로켈에서 데이터가 생성되었지만 점을 소수 구분 기호로 사용하는 로케일로 변환하려고합니다.

독서 코드에 넣고 싶은 첫 번째 변경 사항은 구분 기호를 지정하는 것입니다. 기본적으로 데이터를 다른 셀로 분리하는 것은 쉼표입니다.

쉼표 및 내가 테스트하지 않은 다른 잠재적 인 방법을 변환하는 확실한 방법이 있습니다. 확실한 방법은 메모리에있는 데이터를 검사하고 숫자 패턴 + 쉼표 + 숫자를 인식하고 직접 변환하는 데이터 읽기 및 쓰기 사이에 코드를 추가하는 것입니다.

다른 잠재적 인 방법은 로캘을 쉼표가 소수 구분 기호로 변경하고, 데이터를 읽고, 로캘을 점이 구분 기호로 변경하고, 쓸 수있는 방법 일 수 있습니다. 하지만 내가 말했듯이, 나는 이것을 시도한 적이 없으므로이 방법이 효과가 있는지 나는 모른다.

+0

버그를 지적 해 주셔서 감사합니다! 기본적으로 정보의 형식에 관한 유일한 정보는 주어진 파일이 ".ascii"로 끝난 것입니다. 마지막으로 워드 패드에서 열었을 때 코드없이 해결할 수있는 십진수 문제를 발견했습니다. – mauve

0

Excel의 TextToColumns를 사용하면 1000 단위 구분 기호와 소수 문자를 지정할 수 있습니다. 귀하의 질문에 정확히 어떻게 결과를 원하는지 말할 수는 없습니다.Excel에서 ASCII 파일을 열거 나 가져 오는 것만 큼 간단합니다 (텍스트 열 마법사를 가져 와서 요구 사항을 지정하는 방법).

또한 입력 루틴을 작성하는 것이 약간 어렵습니다. 원본 데이터가 아닌 Excel 형식으로 표시됩니다.

여기에는 파일을 선택할 수있는 VBA 매크로가 있습니다 (파일을 필터링하여 .ascii 파일 유형을 입력 한 다음 줄 단위로 파일을 읽은 다음 맨 앞의 ">"을 제거합니다 (필요하지 않은 경우 생략 할 수 있음). 다음으로 파일을 공백 문자로 분할합니다 (천 및 소수 구분 기호를 지정한 후). VBA 루틴에서 데이터의 대상을 지정할 수 있습니다.

Option Explicit 
'Could use late-binding for easier portability 
' Early binding --> Intellisense help 
'Set reference to Microsoft Scripting Runtime 
Sub GetASCIIFile() 
    Dim FSO As FileSystemObject 
    Dim TS As TextStream 
    Dim sFilePath As String 
    Dim rData As Range 
    Dim S As String 

'set rData to first cell for output 
Set rData = Range("A1") 

'Get File Path 
sFilePath = Application.GetOpenFilename("ASCII Files (*.ascii), *.ascii") 

Set FSO = New FileSystemObject 
Set TS = FSO.OpenTextFile(sFilePath, ForReading) 

Do Until TS.AtEndOfStream = True 
    S = TS.ReadLine 

    'Remove leading > if present 
    If Left(S, 1) = ">" Then S = Mid(S, 2) 

    'Write into cell 
    rData = S 
    Set rData = rData(2, 1) 
Loop 

'Split the data on <space> 

With Range("a2", Cells(Rows.Count, "a").End(xlUp)) 
    .TextToColumns Destination:=[b2], DataType:=xlDelimited, consecutivedelimiter:=True, _ 
    Tab:=False, semicolon:=False, comma:=False, Space:=True, other:=False, _ 
    DecimalSeparator:=",", ThousandsSeparator:="." 

End With 

End Sub 
관련 문제